代码之家  ›  专栏  ›  技术社区  ›  Radosław Roszkowiak

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

  •  2
  • Radosław Roszkowiak  · 技术社区  · 8 年前

    让我们以SQLAlchemy模型为例:

    class Organization(Base):
        __tablename__ = 'organization'
    
        id = Column(Integer, primary_key=True)
        # ... and so on...
    

    在这种情况下,当使用PostgreSQL时 id 是主键,此模型将生成一个序列器创建,称为 organization_id_seq

    是否有可能从创建此sequencer的字段中提取自动生成的sequencer名称(或其他sequencer详细信息)( Organization.id )或来自 Organization 类本身?或者,唯一的方法是在db中“手动”检查它?

    其动机不是在sequencer resetting utility中硬编码sequencer名称,我们在一些测试中使用了sequencer resetting utility。

    1 回复  |  直到 8 年前
        1
  •  2
  •   antonio_antuan    8 年前

    这样发现: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