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

时间:2016-05-11 08:46:49

标签: python sqlalchemy

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

我需要将一列替换为另一列并使用sqlalchemy迁移数据(以使用其数据类型转换机制)。由于sqlite不支持ALTER TABLE,我必须使用batch_alter_table alembic操作。

我的迁移如下所示。它抛出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迁移数据?

我尝试使用原始查询..但它说没有表格:

    s = sa.sql.select([sa.sql.text('goods.*')])
    for row in conn.execute(s):
        print(row)

Hovewer检查员显示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

1 个答案:

答案 0 :(得分:0)

您可以拥有多个batch_alter_table块。使用第一个添加新列,然后(在块之外和之后)运行业务逻辑(在这种情况下,将布尔值转换为某些枚举值),然后使用另一个块删除列。

类似的东西: -

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')