Sqlalchemy 如何创建postgresql';Alembic中的s序列

Sqlalchemy 如何创建postgresql';Alembic中的s序列,sqlalchemy,alembic,Sqlalchemy,Alembic,我正在使用alembic来维护我的表。同时,我使用声明方式更新模型 这是alembic的表格之一: op.create_table( 'groups', Column('id', Integer, Sequence('group_id_seq'), primary_key=True), Column('name', Unicode(50)), Column('description', Unicode(250)), ) 模型如下所示: class Group(B

我正在使用
alembic
来维护我的表。同时,我使用声明方式更新模型

这是alembic的表格之一:

op.create_table(
    'groups',
    Column('id', Integer, Sequence('group_id_seq'), primary_key=True),
    Column('name', Unicode(50)),
    Column('description', Unicode(250)),
)
模型如下所示:

class Group(Base):
    __tablename__ = 'groups'
    id = Column(Integer, Sequence('group_id_seq'), primary_key=True)
    name = Column(Unicode(50))
    description = Column(Unicode(250))

    def __init__(self, name, description):
        self.description = description
        self.name = name
您可以看到,我在alembic迁移和声明性模型中都使用了
序列

但是我注意到,当使用PostgreSQL(v9.1)时,alembic没有创建序列,因此模型无法创建实例,因为它们将使用
nextval()
子句

那么,如何创建alembic迁移,以便在postgresql中真正生成序列呢

在前面链接中找到的
CreateSequence
之后,我仍然需要跳转几圈才能使我的迁移在SQLite和PostgreSQL中工作。目前我有:

def dialect_supports_sequences():
    return op._proxy.migration_context.dialect.supports_sequences


def create_seq(name):
    if dialect_supports_sequences():
       op.execute(CreateSequence(Sequence(name)))
然后在需要时调用
create_seq


这是最佳实践吗?

我不确定你的问题是否正确,但由于没有其他人选择回答,以下是我如何获得完全正常的
id
s:

Alembic:

op.create_table('event',
    sa.Column('id', sa.INTEGER(), autoincrement=True, nullable=False),
班级:

class Event(SQLADeclarativeBase):
    __tablename__ = 'event'
    id = Column(Integer, primary_key = True)

只需将以下内容添加到您的模型中:

field_seq = Sequence('groups_field_seq')
field = Column(Integer, field_seq, server_default=field_seq.next_value())
并将以下内容添加到迁移文件中(在创建表之前):


我最近遇到了同样的问题,下面是我如何解决它的

op.execute("create sequence SEQUENCE_NAME")
我在升级函数中运行了上面的命令,对于降级,在降级函数中分别运行下面的代码

op.execute("drop sequence SEQUENCE_NAME")

但是你没有使用我提到的
序列。我不认为PostgreSQL需要它,但当使用autoincrement时,它会自动创建它。然而,我认为这是一个必须解决的问题,因为SQLAlchemy文档“推广”了序列的使用,作为在所有引擎中使用自动递增ID的一种简单方法……我知道我没有使用它。我没有看到使用它的好处,尤其是当它不起作用的时候。我检查了你的代码,没有看到任何“从100开始序列”或“仅使用偶数”的特殊内容,所以我认为默认行为应该可以。有时,其他人说显而易见的是帮助我回到正轨的原因。MySQL不为postgres或其他任何东西工作:
autoincrement–设置列的AUTO_INCREMENT标志;目前被MySQL方言所理解。
-@zzzeek用以下描述了这个答案:“你所指的答案完全错误”。@MarcoSulla的链接断开了。这是该页面的存档版本:是的,这是目前唯一的方法
从sqlalchemy.schema导入序列,CreateSequence op.execute(CreateSequence(Sequence(“some_Sequence”))
我无法查看该bitbucket URL。此处相同。您能在此处发布相关内容吗?
op.get_context().dial.supports_sequences
似乎比使用
\u proxy
更稳定。只是一些额外的信息,因为我自己找不到。如果要为序列指定起始值,请执行以下操作:
op.execute(CreateSequence(sequence('tablename_id_seq',1000)))
。另外,请注意,序列声明必须放在Alembic版本文件中的表创建语句之前。
op.execute("drop sequence SEQUENCE_NAME")