Alembic 无法识别 False 默认值

zar*_*vic 9 python database postgresql sqlalchemy alembic

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

some_column = Column(Boolean, nullable=False, default=False)
Run Code Online (Sandbox Code Playgroud)

以前是:

some_column = Column(Boolean, nullable=False)
Run Code Online (Sandbox Code Playgroud)

因此添加默认值不会对 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 ###

Run Code Online (Sandbox Code Playgroud)

感谢这方面的任何帮助。

Ian*_*son 9

要自动执行此操作,您必须打开一项设置来检测服务器默认更改。

在您的 中env.py,对于context.configure调用(在线和离线迁移,因此在2 个位置),添加一个compare_server_default=Truekwarg。

直接放入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 或自定义可调用函数,则会发生这种情况。此功能适用于简单的情况,但并不总是能产生准确的结果。

...


小智 8

只需传入false()kwarg server_defaultin即可Column

参考: https: //docs.sqlalchemy.org/en/14/core/sqlelement.html


from sqlalchemy.sql import false

some_column = Column(Boolean, server_default=false(), nullable=False)
Run Code Online (Sandbox Code Playgroud)