可以从SQLAlchemy模型的列中提取相关的序列名称吗?

时间:2018-04-14 15:25:42

标签: python postgresql orm sqlalchemy

我们以SQLAlchemy模型为例:

class Organization(Base):
    __tablename__ = 'organization'

    id = Column(Integer, primary_key=True)
    # ... and so on...

在这种情况下,当在PostgreSQL上时,由于id是主键,因此该模型将在创建音序器时生成,称为organization_id_seq

是否有可能以某种方式提取此自动生成的音序器名称(或者也可能是其他音序器详细信息),该音序器是为(Organization.id)或Organization类本身创建的?或者也许唯一的方法是在db中“手动”检查它?

动机不是在音序器重置实用程序中对音序器名称进行硬编码,而是使用我们在某些测试中使用的团队。

1 个答案:

答案 0 :(得分:1)

找到这种方式:init元数据,反映特定的表,而不是迭代所有约束,找到你需要的。

from model import Model
from sqlalchemy import MetaData
m = MetaData()
m.reflect(Model.query.session.bind, only=[Model.__tablename__])
table_constraints = m.tables[Model.__tablename__].constraints
for constr in table_constraints:
    # checking isinstance(constr, PrimaryKeyConstraint) can be added
    for col in c.columns.values():
        if col.server_default is not None and col.server_default.arg is not None:
            print c.server_default.arg
            # prints nextval('table_id_seq'::regclass)

UPD。 版本允许在没有迭代的情况下获取特定列的序列名称:

from model import Model
from sqlalchemy import MetaData
m = MetaData()
m.reflect(Model.query.session.bind, only=[Model.__tablename__])
sequence_name = Model.id.server_default.arg.text