2011-09-27 15 views
1

我正在嘗試使用sqlalchemy table.create和sqlalchemy-migrate table.rename方法對數據庫進行一些數據庫模式更改,並在select語句中加入了一些插入。我想在交易中包裝所有這些。我無法弄清楚如何做到這一點。這是我的嘗試:如何在事務中包裝create和sqlalchemy-migrate alter statments

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的,遷移column.alter(NAME = 'NEWNAME'),但錯誤,並不起作用在交易中,所以我的分貝處於破碎狀態,我還需要重命名多個列,因此我決定推出自己的代碼。)

回答

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() 
+0

你必須記得在最後調用conn.close()。如果你不這樣做,那麼一旦你引入了超過10次的遷移(我認爲這是sqlalchemy在內部用於池大小的限制)腳本,那麼你的升級腳本會間歇性地掛起,因爲它會被阻塞,等待數據庫連接池,但只有在極少數情況下,當python的GC沒有機會踢你並關閉現有的連接。 – DXM

相關問題