2012-10-25 98 views
3

我有一個小問題。我將一長串數據插入到數據庫中,但可能會發生一些新行引發IntegrityError異常。這很好,我可以輕鬆識別它們。問題是,當我回滾撤銷這個「假」插入時,所有以前的行也被刪除。sqlalchemy回滾插入

然後我想要做的就是回滾到前一個狀態並繼續下一個插入。

import sqlalchemy as alc 

def insert(self, specs): 
    #do stuff to transfor specs in data_db 

    entry = Check_Point(data_db) 
    session.add(entry) 

    try: 
     session.flush() 

    except alc.exc.IntegrityError: 
     print 'int Error' 
     session.rollback() 

因此,研究了一點點,我發現這一點:

http://docs.sqlalchemy.org/en/rel_0_7/orm/session.html#using-savepoint

for record in records: 
    try: 
     with session.begin_nested(): 
      session.merge(record) 
    except: 
     print "Skipped record %s" % record 
session.commit() 

但我真的不能得到它的工作,如果「記錄」是對象的一個​​數組插入(在我的情況下Check_Point的情況下)。我收到以下錯誤:

This Session's transaction has been rolled back by a nested rollback() call. To begin a new transaction, issue Session.rollback() first

我接近解決問題,但需要一些幫助。

在此先感謝!

+2

您正在使用哪種數據庫引擎?它支持'SAVEPOINT'交易嗎? –

+0

嗨,它是一個SQLite3數據庫。它支持Savepoint。 http://www.sqlite.org/lang_savepoint.html 我可以通過嘗試提交每一個新行,但速度非常慢(每次需要插入大約3000行) 謝謝! – bgusach

+0

我做了一些測試,似乎有關於SAVEPOINT和SQLite3的問題。我在SQLAlchemy Group上發佈了帖子,當我有這個澄清時會回覆給您。 –

回答

2

目前SAVEPOINT交易將不能正確地與SQLAlchemy的sqlite3的由於PySQLite錯誤工作。邁克爾·拜爾在SQLAlchemy中詳細解釋了錯誤以及解決錯誤的複雜性,請參閱this SQLAlchemy Google group post

+0

完美,謝謝。 我終於用INSERT或IGNORE使用Literal SQL,它不是最好的解決方案,但它適用於我的目的。而且由於看起來很複雜,我想我會堅持我的解決方案,只要我不需要關於插入錯誤的詳細信息。 感謝amigo。 – bgusach