私はカラムがgoods.visible
(ブール値)で、それをgoods.status
(enum)に置き換えたいと思います。sqlite alembicの移行でデータを移行する方法は?
ある列を別の列に置き換え、sqlalchemyを使用してデータを移行する必要があります(データ型変換メカニズムを使用するため)。 sqliteはこのためにALTER TABLEをサポートしていないので、私はbatch_alter_table
のalembicオペレーションを使用しなければなりません。
移行は次のようになります。私の古いテーブルにはそのような列が存在しないので、私はテーブルから選択する列を指定するload_only
を追加する場合には(新しいテーブルがバッチを使用して、移行のために作成された)、
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')
をsqlite3.OperationalError: no such column: goods.status
をスロー: 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
はまだあなたのポストの残りの部分が、 'sqlite3.OperationalErrorの原因に対処することはできませんgoods.status'は、実際にバッチ操作のようです['batch_op'を介して登録された命令を収集する(http://alembic.readthedocs.io/en/latest/batch.html)、' __exit__'でそれらを実行します。だからwithブロックの中には* status *カラムがありません。 –