【问题标题】:How do I get the name of an SQLAlchemy object's primary key?如何获取 SQLAlchemy 对象的主键的名称?
【发布时间】:2011-07-19 09:43:41
【问题描述】:

我只想以编程方式确定 SQLalchemy 模型主键的名称。

【问题讨论】:

  • 如果此解决方案适合您,则将您的解决方案添加为答案并将其标记为“已回答”是完全可以接受的。这有助于人们寻找未解决的问题。

标签: sqlalchemy


【解决方案1】:

如果使用 SQLAlchemy 0.8 或更高版本,则应使用runtime inspection API

如果模型类是User,唯一的主键是id

>>> from sqlalchemy.inspection import inspect
>>> inspect(User).primary_key[0].name
'id'

如果模型类是User,主键很多,

>>> from sqlalchemy.inspection import inspect
>>> [key.name for key in inspect(User).primary_key]
['id', 'name']

如果使用低于 0.8 的 SQLAlchemy 版本,则应改用 class_mapper() 函数。

>>> from sqlalchemy.orm import class_mapper
>>> class_mapper(User).primary_key[0].name
'id'

在这种情况下,inspect() 函数和 class_mapper() 函数返回相同的对象,但使用 inspect() 更具前瞻性。

【讨论】:

  • 我知道这确实是旧答案,但应该注意,以上所有返回的列名不一定与类属性名匹配。 Mapper还有一个方法get_property_by_column,可以用来访问主键中列对应的ColumnProperty对象。 ColumnProperty 反过来让你访问key,属性的名称,class_attribute 访问类InstrumentedAttribute 等。
【解决方案2】:

如果类是“用户”,并且只有 1 个主键,请执行此操作*:

User.__mapper__.primary_key._list[0].name

*从问题中移开。

【讨论】:

  • 或者,如果您需要所有主键,您可以执行上述列表理解:[k.name for k in User.__mapper__.primary_key]
【解决方案3】:

假设声明性模型类是User

>>> list(User.__table__.primary_key)[0].name
'id'

或者对于具有复合主键的Membership

>>> [pk.name for pk in Membership.__table__.primary_key]
['user_id', 'group_id']

【讨论】:

  • 不知道为什么它在起作用时会投反对票。
猜你喜欢
  • 2010-12-05
  • 2016-09-03
  • 2021-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-13
相关资源
最近更新 更多