2013-03-21 28 views
1

我試圖通過將重複的用戶記錄到另一個表中來在插入中的主鍵衝突後進行恢復。但是,我的代碼產生了錯誤InvalidRequestError: This transaction is inactive回滾後的SQLAlchemy恢復「此事務處於非活動狀態」

不幸的是,回溯並沒有顯示這個函數中發生錯誤的特定行 - 它只是和調用這個函數的函數一樣深(這很奇怪)。

我的嘗試/除了開始/回滾/提交模式看起來是否正確?

def convert_email(db, user_id, response): 
    """Map a submitted email address to a user, if the user 
    does not yet have an email address. 
    """ 
    email = response['text_response'] 
    trans = db.begin() 
    try: 
     update_stmt = users_tbl.update(
       and_(users_tbl.c.user_id==user_id, 
        users_tbl.c.email==None)) 
     db.execute(update_stmt.values(dict(email=email))) 
     trans.commit() 
    except sqlalchemy.exc.IntegrityError as e: 
     trans.rollback() 
     if e.orig.pgcode == UNIQUE_VIOLATION: 
      trans = db.begin() 
      try: 
       user = db.execute(users_tbl.select(users_tbl.c.email==email)) 
       parent_user_id = user.first()['user_id'] 

       insert_stmt = duplicate_public_users_tbl.insert().values(
         user_id=user_id, 
         parent_id=parent_user_id) 
       db.execute(insert_stmt) 
       trans.commit() 
      except sqlalchemy.exc.IntegrityError as e: 
       trans.rollback() 
       if e.orig.pgcode != UNIQUE_VIOLATION: 
        raise 

回答

0

調用函數產生異常,它本身被封裝在事務中。

with engine.begin() as db: 
    convert_email(db, user_id, response) 

內部rollback()調用也必須終止外部事務。這是在通過的文件爲暗示Transaction.close()

...這是用來取消交易,而不會影響一個封閉交易的範圍。

相關問題