postgresql Alembic无法识别假默认值

dy1byipe  于 2022-11-23  发布在  PostgreSQL
关注(0)|答案(2)|浏览(162)

在维护SQLAlchemy数据模型并利用alembic进行版本控制时,我所做的以下代码更改导致了一个空的修订版:

some_column = Column(Boolean, nullable=False, default=False)

而以前它是:

some_column = Column(Boolean, nullable=False)

所以添加一个默认值不会改变alembic,也就是说,生成一个空的版本号。我尝试了SQLAlchemy提供的其他值,比如false()expression.false(),而不是False,但是结果是一样的(空的alembic版本号)。还尝试了server_default,而不是default。问题数据库是PostgreSQL。
当然,我所说的空修订是指alembic不识别SQLAlchemy中所做的任何更改:

def upgrade():
    # ### commands auto generated by Alembic - please adjust! ###
    pass
    # ### end Alembic commands ###

def downgrade():
    # ### commands auto generated by Alembic - please adjust! ###
    pass
    # ### end Alembic commands ###

感谢在这方面的任何帮助。

vwhgwdsa

vwhgwdsa1#

  • 若要自动执行此操作 *,您必须打开一个设置以检测服务器默认更改。

env.py中,对于context.configure调用(在线和离线迁移,因此在2处),添加一个compare_server_default=True kwarg。
最好是自己输入alter_column,并且一定要使用server_default,因为default只是Python端的默认设置(这是可以的,但听起来不是你想要的)。
引自https://alembic.sqlalchemy.org/en/latest/autogenerate.html#what-does-autogenerate-detect-and-what-does-it-not-detect
自动产生可以选择性地侦测:
...
更改服务器默认值。如果将EnvironmentContext.configure.compare_server_default参数设置为True或自定义可调用函数,则会发生此情况。此功能适用于简单情况,但并不总是生成准确的结果。
...

bvuwiixz

bvuwiixz2#

只要通过false()default_server夸格在Column
参考:https://docs.sqlalchemy.org/en/14/core/sqlelement.html

from sqlalchemy.sql import false

some_column = Column(Boolean, server_default=false(), nullable=False)

相关问题