[英]Why am I getting an sqlalchemy.exc.ProgrammingError rather than a sqlalchemy.exc.IntegrityError?
我正在編寫一些帳戶創建代碼並嘗試捕獲特定的sqlalchemy異常,這樣當用戶使用已經與現有帳戶關聯的電子郵件注冊帳戶時,我可以反饋相應的錯誤消息。
我希望在發生這種情況時得到IntegrityError,但我得到的是一個ProgrammingError。 我很樂意接受ProgrammingError,但我正在努力理解為什么我沒有得到我期望的東西。
我為了清晰起見減少了模型和代碼,但模型看起來像:
from service import db
from sqlalchemy import Index
class UserProfile(db.Model):
user_id = db.Column(db.String(255), nullable=False, primary_key=True)
email = db.Column(db.String(255), nullable=False)
def __init__(self, account_data):
self.user_id = account_data['userId']
self.email = account_data['email'].lower()
def __repr__(self):
return 'UserID-{}, Email-{}'.format(self.user_id,self.email)
Index('idx_email', UserProfile.email, unique=True)
代碼的主要部分如下所示:
@app.route('/create_account', methods=['POST'])
def create_account():
account_data = request.get_json()
account_details = UserProfile(account_data)
try:
db.session.add(account_details)
db.session.flush()
# do stuff
db.session.commit()
except ProgrammingError as err:
db.session.rollback()
if "duplicate key value violates unique constraint \"idx_email\"" in str(err):
LOGGER.error('Email address already in use!'
所以,如果我在一些json中發帖,例如:
{
"userId": "Fred",
"email": "a@b.com"
}
然后使用不同的userId再次發布,但同樣的電子郵件:
{
"userId": "Bob",
"email": "a@b.com"
}
我希望第二篇文章引發IntegrityError,但我發現它引發了一個ProgrammingError:
sqlalchemy.exc.ProgrammingError: (pg8000.core.ProgrammingError)
('ERROR',
'23505',
'duplicate key value violates unique constraint "idx_email"',
'Key (email)=(a@b.com) already exists.',
'public',
'user_profile',
'idx_email',
'nbtinsert.c',
'406',
'_bt_check_unique', '', '')
[SQL: 'INSERT INTO user_profile (user_id, email) VALUES (%s, %s)']
[parameters: ('Bob', 'a@b.com')]
我錯過了什么?
不幸的是,當談到DBAPI錯誤時,SQLAlchemy只包裝了底層dbapi兼容庫引發的異常。
也就是說,SQLAlchemy特別引發了ProgrammingError
, 因為pg8000
選擇引發ProgrammingError
。
如果您一直使用psycopg2
來管理底層連接,那么您的錯誤就會表現為IntegrityError
(正如預期的那樣)。
根據pg8000
文檔 ,它永遠不會引發IntegrityError
。 事實上,它不會提出以下任何一項:
這里的教訓是,當涉及到數據庫級錯誤時,您無法保證SQLAlchemy將跨不同的dbapi連接器拋出的類型。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.