sqlalchemy - 给定一个声明性 SQLAlchemy 类,我如何以编程方式检索其作为主键的 Column 对象的列表?

标签 sqlalchemy

假设我在 SQLAlchemy 中有一个类

class Note(Base):
    __tablename__ = 'notes'
    slug = Column('short_title', String, primary_key=True)
    date = Column('day', Date, primary_key=True)
    contents = Column(Text, nullable=True)

仅给定对 Note 类的引用,函数如何构建基于它们构成相应表的主键的列表 ['Note.slug', 'Note.date'] ?

此外,有没有办法根据列属性过滤类属性? (例如可为空、类型、唯一性、索引中的成员资格等)

最佳答案

试试这个来找到主要字段。

from sqlalchemy import create_engine

engine = create_engine('sqlite:///:memory:', echo=True)

from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String, Date, Text
from sqlalchemy.orm.attributes import InstrumentedAttribute


Base = declarative_base()

class Note(Base):
    __tablename__ = 'notes'
    slug = Column('short_title', String, primary_key=True)
    date = Column('day', Date, primary_key=True)
    contents = Column(Text, nullable=True)

if __name__ == '__main__':
    import inspect
    predicate = lambda x: isinstance(x, InstrumentedAttribute)

    fields = inspect.getmembers(Note, predicate=predicate)

    fields_vars = [vars(y.property.columns[0]) for x,y in fields]

    primary_fields = [x['name'] for x in fields_vars if x['primary_key']]

    print "All Fields :", fields_vars

    print "Primary Fields :", primary_fields

通过这种方式,您可以从模型中找到任何类型的字段。

关于sqlalchemy - 给定一个声明性 SQLAlchemy 类,我如何以编程方式检索其作为主键的 Column 对象的列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9398664/

相关文章:

Python sqlalchemy order_by 数学运算(除法)不对结果进行排序

python - 在 Python 3 中使用 Sqlalchemy 查找 TypeError 的原因以插入 MySQL

python - 关联对象处理、将子项附加到父项、隐藏 “middle” 表的使用

python - 如何使用 sql alchemy 进行联接查询?

python - 列 "Column"必须出现在 GROUP BY 子句中 -- SQLAlchemy

python - 如何自动将数据库反射(reflect)到 sqlalchemy 声明性?

python - SQLAlchemy 是否可以使用显式 CROSS JOIN?

python - SQLAlchemy:AttributeError:无法在列 '_sa_instance_state' 的行中找到列

python - SQLAlchemy 自动提交?

python - SQLAlchemy:动态加载对另一个模块的反向引用