14

我有一个非常简单的 SqlAlchemy 模型

class User(Base):
    """ The SQLAlchemy declarative model class for a User object. """
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
    phone = Column(String, unique=True)
    email = Column(String, unique=True)

插入新用户时,IntegrityError如果电子邮件或电话重复,则可能发生。

有什么方法可以检测哪些列违反了完整性错误?或者是进行单独查询以查看或存在值的唯一方法?

4

4 回答 4

6

您可以使用以下方式获取底层代码、消息,并相应地格式化消息。

except exc.IntegrityError as e:
       errorInfo = e.orig.args
       print(errorInfo[0])  #This will give you error code
       print(errorInfo[1])  #This will give you error message

顺便说一句,您必须从 sqlalchemy 导入 exc:from sqlalchemy import exc 如果您需要任何其他信息,请告诉我。我可以试试看。

有关 sqlalchemy exc 的更多信息,请查找代码:https ://github.com/zzzeek/sqlalchemy/blob/master/lib/sqlalchemy/exc.py

于 2019-04-08T20:39:39.103 回答
5

不幸的是,没有干净的方法可以做到这一点,但我在 IntegrityError 和parse模块上使用了 orig 属性:

try:
    db.session.add(user)
    db.session.commit()
except IntegrityError, e:
    dupe_field = parse('duplicate key value violates unique constraint "{constraint}"\nDETAIL:  Key ({field})=({input}) already exists.\n', str(e.orig))["field"]

这可能不是 IntegrityError 抛出的唯一错误字符串,它可能会在未来对 SQLAlchemy 的更新中发生变化,因此它并不理想

于 2016-11-15T15:42:38.683 回答
2
try:
    ....
except IntegrityError as e:
    print(e.orig.diag.message_detail)

这对我有用。

于 2021-03-24T17:25:42.623 回答
-4

我通常为此使用try catch。

try:
    session.commit()
catch:   
str(sys.exc_info()[0]) + " \nDESCRIPTION:  "+ str(sys.exc_info()[1]) + "\n" + str(sys.exc_info()[2])

当我遇到完整性错误时,我会收到以下消息,我会跳过该特定事务并继续其余事务

DESCRIPTION:  (IntegrityError) duplicate key value violates unique constraint "test_code"
DETAIL:  Key (test_code)=(5342) already exists.
'INSERT INTO test_table (pk, test_code, test_name) VALUES (%(pk)s, %(test_code)s, %(test_name)s)' { 'pk': '1', 'test_code': '5342', 'test_name': 'test' }
于 2012-08-02T10:26:01.420 回答