我有一个列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
答案 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')