在批处理模式下使用 Alembic 更改 sa.Column 可空属性

Att*_*k68 6 database sqlalchemy alembic

我有一个数据库升级迁移,我想应用于数据库列:

def upgrade():
    # ### commands auto generated by Alembic - please adjust! ###
    with op.batch_alter_table('details') as batch_op:
        batch_op.alter_column('details', 'non_essential_cookies',
                              existing_type=sa.BOOLEAN(),
                              nullable=False)
    # ### end Alembic commands ###
Run Code Online (Sandbox Code Playgroud)

我正在实施批处理模式,因为不支持 ALTER,并且之前我收到了此错误:sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) near "ALTER":。但是,我希望批处理模式能够工作,但现在我收到了新的错误:

TypeError: <flask_script.commands.Command object at 0x1149bb278>: alter_column() got multiple values for argument 'nullable'.

我的表中只有一个元组,并且相关属性不为 NULL,因此数据库迁移是有效的。我只是不明白为什么有多个值

Sup*_*oot 8

来自文档

\n\n
\n

该方法用作上下文管理器,它返回\n BatchOperations 的实例;此对象与操作相同,只是省略了表名和架构名称。

\n
\n\n

这里的关键点是,在实例上调用操作时,您不必提供表名BatchOperations

\n\n

的签名alter_column是:

\n\n
alter_column(table_name, column_name, nullable=None, server_default=False, new_column_name=None, type_=None, existing_type=None, existing_server_default=False, existing_nullable=None, schema=None, **kw)\n
Run Code Online (Sandbox Code Playgroud)\n\n

所以从你的代码来看:

\n\n
with op.batch_alter_table(\'details\') as batch_op:\n        batch_op.alter_column(\'details\', \'non_essential_cookies\',\n                              existing_type=sa.BOOLEAN(),\n                              nullable=False)\n
Run Code Online (Sandbox Code Playgroud)\n\n

\'details\'正在被传递给column_name,并且\'non_essential_cookies\'nullable作为位置参数传递给 。nullable当您稍后使用关键字 arg,指定 Again 的值时,会导致此问题nullable=False

\n