15

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

您可以看到,我Sequence在 alembic 迁移和声明性模型中都使用了 。

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

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

4

4 回答 4

18

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

field_seq = Sequence('groups_field_seq')
field = Column(Integer, field_seq, server_default=field_seq.next_value())

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

from sqlalchemy.schema import Sequence, CreateSequence
op.execute(CreateSequence(Sequence('groups_field_seq')))
于 2017-04-10T09:16:52.287 回答
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)))

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

这是最佳做法吗?

于 2013-06-19T16:44:14.040 回答
3

不确定我的问题是否正确,但没有其他人选择回答,这就是我如何得到完全正常id的 s:

蒸馏器:

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

班上:

class Event(SQLADeclarativeBase):
    __tablename__ = 'event'
    id = Column(Integer, primary_key = True)
于 2013-10-09T02:55:03.957 回答
1

我最近遇到了同样的问题,这就是我解决它的方法。

op.execute("create sequence SEQUENCE_NAME")

我在升级函数中运行了上面的命令,对于降级,分别在降级函数中运行下面的代码。

op.execute("drop sequence SEQUENCE_NAME")
于 2019-08-27T18:37:03.333 回答