Django - 区分不同类型的IntegrityError

djs*_*s22 11 python mysql django

我正在使用django + MySQL.有时,我将重复数据插入到我的数据库中,这会导致django引发一个IntegrityErrror.

问题是,django/python对几个不同的MySQL错误使用同样的错误.区分它们的唯一方法是查看错误代码.例如,

try:
    # code that raises integrity error
except IntegrityError
    if e.args[0] == 1062:
        raise CustomCreatedDuplicateEntryError
    else:
        raise e
Run Code Online (Sandbox Code Playgroud)

我的问题是:这样做安全吗?如果是这样,为什么不在较低级别实施?似乎我不能成为唯一一个想要对IntegrityError进行更细粒度控制的人.

谢谢!

编辑

用于引发此错误的代码

class Foo(django.db.models.Model):
    guid = models.CharField(max_length=32, db_index=True, unique=True)

Foo(guid=a).save()
# this raises an IntegrityError with code 1062!
Foo(guid=a).save()
Run Code Online (Sandbox Code Playgroud)

rub*_*eet 5

这样做安全吗?

这不是不安全的.虽然通过这样做,您已经在应用程序和数据库(MySQL)之间创建了一个耦合.如果您决定用其他数据库解决方案替换MySQL,那该怎么办?错误代码将被更改,您的代码将引发不一致的消息.

如果是这样,为什么不在较低级别实施?

可能与我有同样的担忧.

  • 我觉得奇怪的是,像 django 这样的数据库不可知 ORM 不仅仅映射多个数据库的错误代码。请参阅安德鲁对此问题的评论中的对话 (2认同)