如何从 SqlAlchemy 中的声明性 table 获取列引用?

How to get Column reference from declarative table in SqlAlchemy?

我使用 声明式 样式通过 SQLAlchemy 定义我的表。

Base = declarative_base()

class MyTable(Base):
    id = Column('someone_put_a_strange_for_id', Integer)

现在,当我在类中定义ForeignKey时,我需要使用

MyTable.__table__.c.someone_put_a_strange_for_id

引用此 id 列属性。有什么办法可以使用

MyTable.id.some_magic

获取此列属性?

这里有两个简单的选项。

最简单的就是,直接参考class!

上的属性即可
Base = declarative_base()

class MyTable(Base):
    __tablename__ = 'mt'
    id = Column('someone_put_a_strange_for_id', Integer, primary_key=True)
    bar = Column(Integer)

fk = ForeignKeyConstraint(['bar'], [MyTable.id])

这实际上不是 Column 对象,但是在几乎所有情况下,SQLAlchemy 都会查看此对象以寻找名为 __clause_element__() 的特殊属性,该属性将提取实际Column。在现代 SQLAlchemy 版本中,这应该可以在任何地方工作,post 如果有某个地方它不工作,请报告错误。

另一种是在列上放一个.key:

class MyTable(Base):
    id = Column('someone_put_a_strange_for_id', Integer, key='id')

上面,该列现在在所有 in-Python 情况下都是 table.c.id,"name" 仅在 SQL 一侧。因此,如果您直接处理 table.c,就可以了。

还有更多选择! class 上的映射器也有自己的 .c 属性,您也可以通过以下方式获取它:

from sqlalchemy import inspect

Base = declarative_base()

class MyTable(Base):
    __tablename__ = 'mt'
    id = Column('someone_put_a_strange_for_id', Integer, primary_key=True)

inspect(MyTable).c.id