我正在使用
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 迁移和声明性模型中都使用了
Sequence
。
但我注意到,当使用 PostgreSQL (v9.1) 时,alembic 不会创建任何序列,因此模型无法创建实例,因为它们将使用
nextval(<sequence name>)
子句。
那么,如何创建 Alembic 迁移以便在 postgresql 中真正生成序列?
只需将以下内容添加到您的模型中:
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')))
在 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
。
这是最佳实践吗?
不确定我是否正确回答了你的问题,但由于没有其他人选择回答,这就是我如何变得完全正常
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)
我最近遇到了同样的问题,这是我解决的方法。
op.execute("create sequence SEQUENCE_NAME")
我在升级函数中运行了上述命令,对于降级,分别在降级函数中运行了以下代码。
op.execute("drop sequence SEQUENCE_NAME")