具体了解 SQLite 中哪个 FOREIGN KEY 约束失败了

问题描述 投票:0回答:3

我收到 SQLite 错误消息“FOREIGN KEY 约束失败”。这是完整的错误信息(除了 SQL 查询的一部分),但没有任何帮助。 (事实上,它与 Oracle 错误消息一样好(或坏)。)我需要知道约束的名称来调查程序中的问题。不幸的是,没有网络支持平台可以与 SQLite 社区讨论这个问题。有人知道如何从 SQLite 库中获取有关错误的更多信息吗?

我专门使用 .NET 的 System.Data.SQLite 库,但错误消息直接来自核心,并且没有其他异常属性可以帮助我。

sqlite
3个回答
12
投票

由于 SQLite 中实现延迟 FK 约束的方式,引发错误时此信息不可用。

您可以将 FK 检查重新实现为触发器。 或者,记录失败命令中的值,然后手动查找数据。


0
投票

在 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

0
投票

马里奥,对不起。我有一个关于 django 中的 websocket 的问题。我需要你的帮助。 Django:用于实时动态更新 django 模板的 websockets(仅此方式,无 Ajax 等)

© www.soinside.com 2019 - 2024. All rights reserved.