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