如何在事务中包装create和sqlalchemy-migrate alter语句

时间:2011-09-27 09:14:11

标签: sqlalchemy sqlalchemy-migrate

我正在尝试对我的数据库进行一些数据库架构更改,使用sqlalchemy table.create和sqlalchemy-migrate table.rename方法,以及一些插入到选择的状态。我想在一个事务中包装所有这些。我无法弄清楚如何做到这一点。这就是我试过的:

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')但是这些错误,并且在事务中不起作用,因此使我的数据库处于中断状态。我还需要重命名多个列,所以我决定推出自己的代码。)

1 个答案:

答案 0 :(得分: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()