如何在sqlite alembic迁移中迁移数据?

2024-03-28 20:32:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一列goods.visible(布尔值),我想用goods.status(枚举)替换它。在

我需要用另一列替换一列,并使用sqlalchemy迁移数据(使用它的数据类型转换机制)。由于sqlite不支持ALTER TABLE,因此我必须为此使用batch_alter_tablealembic操作。在

我的迁移如下所示。它抛出sqlite3.OperationalError: no such column: goods.status,因为在我的旧表中没有这样的列(使用批处理创建新表用于迁移)

def upgrade():
    with op.batch_alter_table('goods') as batch_op:
        batch_op.add_column(sa.Column('status', sa.Enum('published', 'unpublished', 'deleted'), nullable=True))

        conn = op.get_bind()
        Session = sa.orm.sessionmaker()
        session = Session(bind=conn)
        for good in session.query(Good):
            # I want to perform some data updates & insert data into new column
        batch_op.drop_column('visible')

如果我要添加load_only来指定要从表中选择的列: sqlite3.OperationalError: no such column: goods.status

我将得到错误sqlalchemy.exc.ArgumentError: Can't find property named 'visible' on the mapped entity Mapper|Good|goods in this Query.。我明白为什么我得到它-我没有更多的属性在我的模型中可见。在

在这种情况下,如何使用alembic迁移数据?在

我试着用原始查询。。但上面写着没有桌子:

^{pr2}$

Hovewer inspector显示goods表:

 inspector = sa.inspect(conn.engine)
    for table_name in inspector.get_table_names():
        print(table_name)
        for column in inspector.get_columns(table_name):
            print("Column: %s" % column['name'])

显示器

goods
Column: id
Column: name
Column: price
Column: visible

Tags: nameinforgetinspectorstatusbatchsa
1条回答
网友
1楼 · 发布于 2024-03-28 20:32:09

可以有多个batch\u alter_表块。使用第一个块添加新列,然后(在块外部和之后)运行业务逻辑(在本例中,将布尔值转换为某些枚举值),然后使用另一个块删除列。在

什么比如:在

def upgrade():
    with op.batch_alter_table('goods') as batch_op:
        batch_op.add_column(sa.Column('status', sa.Enum('published', 'unpublished', 'deleted'), nullable=True))
    # Do your business logic here
    with op.batch_alter_table('goods') as batch_op:
        batch_op.drop_column('visible')

相关问题 更多 >