- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我在 Django 的 IntegrityError 中缺少表名:
Traceback (most recent call last):
...
return self.cursor.execute(sql, params)
File ".../django/db/utils.py", line 94, in __exit__
six.reraise(dj_exc_type, dj_exc_value, traceback)
File ".../django/db/backends/utils.py", line 64, in execute
return self.cursor.execute(sql, params)
IntegrityError: null value in column "manager_slug" violates not-null constraint
DETAIL: Failing row contains (17485, null, 2017-10-10 09:32:19, , 306).
有没有办法查看 INSERT/UPDATE 正在访问哪个表?
我们使用 PostgreSQL 9.6。
这是一个一般性问题:如何获得更好的错误信息?
这不是关于这个特定专栏的问题。很快就找到了相关的表格和专栏。但我想改进来 self 们 CI 系统的错误消息。下次我想立即看到表名。
我知道,如果我在软件开发过程中看到此错误,我可以使用调试器轻松揭示缺失的信息。但在我的例子中,这发生在生产中,我只有上面的堆栈跟踪。
最佳答案
此回溯中的异常消息是来自数据库驱动程序的原始消息。如果有任何内容被谷歌搜索、报告等,了解这一点和回溯很有用。
所有后端的异常类都是相同的 django.db.utils.IntegrityError,但消息或参数取决于后端:
“manager_slug”列中的空值违反了非空约束\n
DETAILS...\n
(1048, "列 'manager_slug' 不能为 null")
NOT NULL 约束失败:appname_modelname.manager_slug
表名仅在 sqlite3
后端可见。一些后端仅使用异常的字符串参数,但 mysql
使用两个参数:数字错误代码和消息。 (我愿意接受这是一个一般性问题,不仅是 PostgreSQL。)一些后端的作者希望应用程序的作者直接或从 SQL 知道表名,但对于一般的 ORM 包来说并非如此。即使在技术上可以做到完美,也没有更好的和普遍接受的方式来扩展消息。
开发调试简单:
python manage.py test --debug-sql
:“打印失败时记录的 SQL 查询。”...但您可能要求在生产中出现运行时错误。
我猜你在一个如此笼统的问题中可能的意图,你可能对哪个方向感兴趣。
A) traceback 中最重要的信息通常是在许多行之上的几行".../django/db/...”。这对古鲁来说是非常容易的。如果代码不像 Django 管理站点那样动态和通用,则很有可能使用它,其中 myobj.save()
调用附近的代码(父框架中都不包含)不包含显式模型名称。示例:
# skip some initial universal code in ".../django/..."
...
# our apps start to be interesting... (maybe other installed app)
...
# START HERE: Open this line in the editor. If the function is universal, jump to the previous.
File ".../me/app/...py", line 47, in my...
my_obj.save()
# skip many stack frames .../django/db/... below
File ".../django/db/models/base.py", line 734, in save
# self.save_base(... # this line 733 is not visible
force_update=force_update, update_fields=update_fields)
...
# interesting only sql and params, but not visible in production
File ".../django/db/backends/utils.py", line 64, in execute
return self.cursor.execute(sql, params)
IntegrityError (or DataError similarly)...
B) 通过模型的共同祖先获取信息
class ...(models.Model):
def save(self, *args, **wkargs):
try:
super(..., self).save(*args, **wkargs)
except django.db.utils.IntegrityError as exc:
new_message = 'table {}'.format(self._meta.db_table)
exc.extra_info = new_message
# this is less compatible, but it doesn't require additional reading support
# exc.args = exc.args + (new_message,)
reraise
这可能会使多重继承的调试复杂化。
C) 在 Django db 中的实现 会更好,但我无法想象它会被接受并且在出现问题后不会恢复。
关于python - IntegrityError 中缺少表名(Django ORM),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46661147/
我在 app_name 文件夹的根目录下的 django 应用程序中运行脚本;就像在 app_name>app_name 中一样。 在脚本的顶部,我有这个: import os import sys
我正在使用 sqlite 数据库,我将模型声明为: class User(db.Model): __tablename__ = 'users' id = db.Column(db.In
我正在使用 sqlite 数据库并且我在这个要点中声明了模型 https://gist.github.com/mmahesh/7245561 我添加了一个带有事务管理器的模型实例作为 with tra
我的网页的注册 View (如下)通过 Django 的身份验证模型 User 创建了一个新用户,然后使用该新创建的用户 ID 通过我自己的模型 account.Users 添加更多信息。我的问题是,
我正在尝试使用复合主键创建一个表。它有一个整数和两个字符串字段作为键。当我提交 session 时,它会引发 IntegrityError .我在做什么有什么问题? class Targets(db.
当我尝试将新条目保存到名为“config”的表中时遇到了这个问题, class Config(models.Model): ident = models.CharField(max_lengt
找不到解决方案。我现在传递一个元组列表,其中包含要插入的信息而不是从其他表中提取的信息,问题就消失了。 我目前正在编写将要编辑表格的代码。我有几行信息要插入,但无论顺序如何,我总是在第四个元素上收到
我有 python 线程应用程序 + Postgres。我正在使用 Django 的 ORM保存到 Postgres.. 我有并发保存调用。偶尔有 2 个线程保存导致问题的相同主键。 Postgres
有人可以向我解释如何正确测试 Postgres 数据库错误,尤其是 IntegrityError。例如我有下一个测试: class TestSlugs(TestCase): # This sl
我在尝试删除 User 时收到 IntegrityError: IntegrityError: (1451, 'Cannot delete or update a parent row: a fo
在 python 中,我正在使用 importmany 填充 SQLITE 数据库,因此我可以一次导入数万行数据。我的数据包含在元组列表中。我在数据库中设置了我想要的主键。 我遇到的问题是主键错误会引
每当尝试附加文件时,我的应用程序(本地)都会引发ActiveStorage::IntegrityError错误。我如何摆脱这个错误? 我只有一个has_one_attached,但我不知道该错误是如何
我想插入几个User数据库中的行。我真的不在乎插入是否成功,只要我得到通知,在这两种情况下我都能做到,那么哪一个在性能(主要是速度)方面更好? 始终插入行(通过调用模型的 save 方法)并捕获潜在的
我开始使用 factory_boy 包,所以我设置了一些工厂并想测试创建的对象不会引发任何验证错误。 这是我正在使用的 mixin,它基本上从模块中获取每个工厂,创建一个实例,然后测试 .full_c
我有一个模型 LucyGuide,它通过 OneToOneField 扩展了 Django 的 User 模型: class LucyGuide(models.Model): user = m
我有一个模型 LucyGuide,它通过 OneToOneField 扩展了 Django 的 User 模型: class LucyGuide(models.Model): user = m
我正在尝试在 Django 中创建配方/成分模型 在我的 models.py 中我得到了 class Ingredient(models.Model): name = models.CharF
我正在使用 Django 构建一个简单的博客应用程序。我想实现使用表单添加新博客的功能。出现一些问题。 这是我的 models.py from django.db import models from
我知道还有许多其他问题与完全相同的问题有关,但我已经尝试过他们的答案,但到目前为止没有一个有效。 我正在尝试从与其他表有关系的表中删除记录。这些表中的外键是 nullable=false ,因此尝试删
我正在与普通/ guest 用户一起处理我的结帐 View ,但很难解决完整性错误。想法是让访客用户仅使用电子邮件注册才能结帐,我需要将用户电子邮件设置为唯一。 模型.py from django.c
我是一名优秀的程序员,十分优秀!