【问题标题】:How to get Column reference from declarative table in SqlAlchemy?如何从 SqlAlchemy 中的声明性表中获取列引用?
【发布时间】:2015-01-09 03:04:56
【问题描述】:

我使用 declarative 样式来使用 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

要获取此 Column 属性吗?

【问题讨论】:

  • 为什么不直接引用模型(而不是列):ForeignKey(MyTable.id)
  • 我试过了,还是不行。因为属性名和表字段名不同。
  • 奇怪,这是迈克在答案中提到的第一个简单选项,它一直对我有用。希望 Mike 的回答中列出的其他选项对您有所帮助。

标签: python sqlalchemy


【解决方案1】:

这里有两个简单的选择。

最简单的就是,引用类上的属性就行了!

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 版本中,这应该几乎可以在任何地方使用,如果在某些地方它不起作用,请发布错误报告。

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

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

在上面,该列现在在所有 Python 案例中都是 table.c.id,“名称”仅在 SQL 端。因此,如果您直接处理 table.c,就可以了。

还有更多选择!你的类上的映射器也有自己的.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

【讨论】:

  • 谢谢,我试试看。
猜你喜欢
  • 2011-09-21
  • 2018-10-22
  • 2013-04-01
  • 1970-01-01
  • 2023-01-28
  • 1970-01-01
  • 2011-10-01
  • 2016-07-11
  • 2015-02-25
相关资源
最近更新 更多