我收到 SQLite 错误消息“FOREIGN KEY 约束失败”。这是完整的错误信息(除了 SQL 查询的一部分),但没有任何帮助。 (事实上,它与 Oracle 错误消息一样好(或坏)。)我需要知道约束的名称来调查程序中的问题。不幸的是,没有网络支持平台可以与 SQLite 社区讨论这个问题。有人知道如何从 SQLite 库中获取有关错误的更多信息吗?
我专门使用 .NET 的 System.Data.SQLite 库,但错误消息直接来自核心,并且没有其他异常属性可以帮助我。
由于 SQLite 中实现延迟 FK 约束的方式,引发错误时此信息不可用。
您可以将 FK 检查重新实现为触发器。 或者,记录失败命令中的值,然后手动查找数据。
在 Django 项目中,下面是我将
FOREIGN KEY constraint failed
替换为(例如)DETAIL: Key (base_id)=(1a389dc3-5bc1-4132-8a4a-c8200533503a) is not present in table "backend_base"
...
该解决方案是 Django 特定的,因为它基于 Django ORM 的方法;
obj
应该是引起 model.save() 异常的 Model 实例
from django.core.exceptions import ObjectDoesNotExist
def explain_integrity_errors(obj):
"""
Replace 'FOREIGN KEY constraint failed' error message provided by sqlite
with something useful (i.e. the exception thrown by PostgreSQL):
'DETAIL: Key (base_id)=(1a389dc3-5bc1-4132-8a4a-c8200533503a) is not present in table "backend_base"'
"""
error_msg = ''
errors = []
# Scan all FKs
relation_fields = [f for f in obj._meta.concrete_fields if f.is_relation]
for field in relation_fields:
try:
# try to access the related target
fk_target = getattr(obj, field.name)
except ObjectDoesNotExist as e:
# Log offending FK
fk_field = field.name + '_id'
fk_value = getattr(obj, fk_field)
fk_table = field.related_model._meta.db_table
errors.append('Key (%s)=(%s) is not present in table "%s"' % (
fk_field,
str(fk_value),
fk_table
))
if len(errors):
error_msg = ' DETAIL: ' + "; ".join(errors)
return error_msg
马里奥,对不起。我有一个关于 django 中的 websocket 的问题。我需要你的帮助。 Django:用于实时动态更新 django 模板的 websockets(仅此方式,无 Ajax 等)