【问题标题】:Change sa.Column nullable property with Alembic in Batch mode在批处理模式下使用 Alembic 更改 sa.Column 可为空的属性
【发布时间】:2018-12-29 18:21:14
【问题描述】:

我有一个数据库升级迁移要应用到数据库列:

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 ###

我正在实施批处理模式,因为不支持 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,所以数据库迁移是有效的。我只是不明白为什么会有多个值

【问题讨论】:

    标签: database sqlalchemy alembic


    【解决方案1】:

    来自docs

    该方法用作上下文管理器,它返回一个实例 批量操作;此对象与操作相同,除了 表名和模式名被省略。

    这里的重点是在BatchOperations 实例上调用操作时不必提供表名。

    alter_column 的签名是:

    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)
    

    所以从你的代码:

    with op.batch_alter_table('details') as batch_op:
            batch_op.alter_column('details', 'non_essential_cookies',
                                  existing_type=sa.BOOLEAN(),
                                  nullable=False)
    

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

    【讨论】:

    • 是的,是的,显然非常简单(当它向我指出时)。像魅力一样工作,电视。看来你有找到我的问题的诀窍。我目前还有一两个未解决的问题没有答案!
    猜你喜欢
    • 2016-05-11
    • 1970-01-01
    • 2019-11-01
    • 2012-03-31
    • 2016-08-13
    • 2010-10-19
    • 2020-02-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多