如何在Alembic中创建postgresql的序列

man*_*anu 11 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)),
)
Run Code Online (Sandbox Code Playgroud)

模型如下:

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
Run Code Online (Sandbox Code Playgroud)

你可以看到,我正在使用Sequencealembic迁移和声明模型.

但我注意到,当使用PostgreSQL(v9.1)时,alembic不会创建任何序列,因此模型无法创建实例,因为它们将使用该nextval(<sequence name>)子句.

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

Kav*_*veh 8

只需在模型中添加以下内容:

field_seq = Sequence('groups_field_seq')
field = Column(Integer, field_seq, server_default=field_seq.next_value())
Run Code Online (Sandbox Code Playgroud)

并在迁移文件中添加以下内容(在创建表之前):

from sqlalchemy.schema import Sequence, CreateSequence
op.execute(CreateSequence(Sequence('groups_field_seq')))
Run Code Online (Sandbox Code Playgroud)


man*_*anu 6

https://bitbucket.org/zzzeek/alembic/issue/60/autogenerate-for-sequences-as-well-as#comment-4100402找到一个提示

按照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)))
Run Code Online (Sandbox Code Playgroud)

然后create_seq在我需要的时候调用它。

这是最佳做法吗?

  • 是的,这是目前唯一的方法。`from sqlalchemy.schema import Sequence, CreateSequence op.execute(CreateSequence(Sequence("some_sequence"))` (2认同)