Python 是否可以从SQLAlchemy模型';谁的专栏?

Python 是否可以从SQLAlchemy模型';谁的专栏?,python,postgresql,orm,sqlalchemy,Python,Postgresql,Orm,Sqlalchemy,让我们以简单的SQLAlchemy模型为例: class Organization(Base): __tablename__ = 'organization' id = Column(Integer, primary_key=True) # ... and so on... 在这种情况下,当使用PostgreSQL时,由于id是主键,因此该模型将创建一个称为organization\u id\u seq的序列器 是否有可能从创建此sequencer的字段(Organi

让我们以简单的SQLAlchemy模型为例:

class Organization(Base):
    __tablename__ = 'organization'

    id = Column(Integer, primary_key=True)
    # ... and so on...
在这种情况下,当使用PostgreSQL时,由于
id
是主键,因此该模型将创建一个称为
organization\u id\u seq
的序列器

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


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

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

这可能是一个好的方向。在我的例子中,
col.server\u默认值是None,但是我只做了一个简短的检查。我将深入研究它,并在明天尝试使它工作。如果您未在列定义中指定它,它可能是默认值
Metadata().reflect()
从DBMS检索DDL:完整表结构、索引、约束、触发器等。如果只为postgresql表的列指定
primary\u key=True
,sqla将为其生成
serial
类型。Postgresql为它分配了一些序列。你是对的,我昨天尝试的元数据没有正确反映。它起作用了。然而,我认为获得这个最终文本
nextval('table\u id\u seq':regclass)
更简单、更优雅的方法是
m.tables[Model.\u tablename\uu].columns['id'].server\u default.arg.text
。如果你觉得你的代码修改合适,我想你可以更新答案,我会接受的。谢谢你的努力!你说得对,但只是为了你的案子。我的版本更广泛。无论如何更新:)自动为主键创建的序列总是由表名、列名和
seq
后缀组成,用下划线分隔。谢谢,这会让事情变得轻松。无论Postgres版本如何,这都是人们认为理所当然的事情,还是仅仅是一些可能会发生变化的实现细节?好吧,我已经使用Postges多年了,一直都是这样。我看不出有人为什么要改变它。然而,另一方面,据我所知,它并没有正式的记录。非常感谢。