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

给定一个声明性SQLAlchemy类,如何以编程方式检索作为主键的列对象列表?,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.

假设我有一门炼金术课,比如

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

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

不完全是所需的字段,而是仅使用内部信息的较短的变量:

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

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__':
    print [(i.name, i.primary_key) for i in Note.__table__.columns]
这给了我们以下结果:

[('short_title', True), ('day', True), ('contents', False)]

这将为您提供作为主键的列名列表:

from sqlalchemy.orm import class_mapper

primary_keys = [key.name for key in class_mapper(Note).primary_key]