2016-05-11 35 views
1

私はカラムが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 
+1

はまだあなたのポストの残りの部分が、 'sqlite3.OperationalErrorの原因に対処することはできませんgoods.status'は、実際にバッチ操作のようです['batch_op'を介して登録された命令を収集する(http://alembic.readthedocs.io/en/latest/batch.html)、' __exit__'でそれらを実行します。だからwithブロックの中には* status *カラムがありません。 –

答えて

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') 
関連する問題