1

sqlalchemy table.create および sqlalchemy-migrate table.rename メソッドに加えて、select ステートメントへの挿入を使用して、db にいくつかの db スキーマの変更を試みています。これらすべてをトランザクションにラップしたいと思います。これを行う方法がわかりません。これは私が試したものです:

engine = sqlalchemy.engine_from_config(conf.local_conf, 'sqlalchemy.')
trans = engine.connect().begin()
try:
    old_metatadata.tables['address'].rename('address_migrate_tmp', connection=trans)
    new_metatadata.tables['address'].create(connection=trans)
except:
    trans.rollback()
    raise
else:
    trans.commit()

しかし、次のエラーが発生します。

AttributeError: 'RootTransaction' object has no attribute '_run_visitor'

(sqlalchemy-migrate column.alter(name='newname') を使用してみましたが、エラーが発生し、トランザクションで機能しないため、データベースが壊れた状態のままになります。また、複数の列の名前を変更する必要があるため、自分のコードをロールすることにしました。)

4

1 に答える 1

2

ああ、トランザクションが作成された接続を使用する必要があります。

engine = sqlalchemy.engine_from_config(conf.local_conf, 'sqlalchemy.')
conn = engine.connect()
trans = conn.begin()
try:
    old_metatadata.tables['address'].rename('address_migrate_tmp', connection=conn)
    new_metatadata.tables['address'].create(bind=conn)
except:
    trans.rollback()
    raise
else:
    trans.commit()
于 2011-09-27T10:08:35.290 に答える