Joe*_*Joe 4 django django-models
这是健全性检查问题之一。这应该是非常明显的。要么是司机出了什么问题,要么我忽略了一些明显的事情。
我有一个 Django 模型字段。它是一个整数字段,非空,有选择。
PROVENANCE_X = 0
PROVENANCE_Y = 1
PROVENANCE_CHOICES = [
(PROVENANCE_X, "Provenance X"),
(PROVENANCE_Y, "Provenance Y")
]
Run Code Online (Sandbox Code Playgroud)
在模型中:
provenance = models.IntegerField(choices=PROVENANCE_CHOICES, default=PROVENANCE_X)
Run Code Online (Sandbox Code Playgroud)
只是为了检查一下,这是 Postgres 所说的:
provenance | integer | not null
Run Code Online (Sandbox Code Playgroud)
当我在管理员中保存模型时,出现错误。
DatabaseError
column "provenance" is not of a character type
Run Code Online (Sandbox Code Playgroud)
没有自定义管理内容。错误完全在 Django 代码中,但我不知道在哪里。我在save
方法中放置了一个断点只是为了在调用 super 之前立即检查:
(Pdb) print self.provenance
0
Run Code Online (Sandbox Code Playgroud)
那么某些代码在某处试图插入一个字符而不是一个整数吗?
错误来自django/db/backends/postgresql_psycopg2/base.py
.
该堆栈帧的局部变量中的查询变量:
'INSERT INTO "MODEL" ("A", "provenance", "B", "C") VALUES (%s, %s, %s, %s) RETURNING "MODEL"."id"'
args
(False,
0,
u'test',
'098f6bcd4621d373cade4e832627b4f6',
)
Run Code Online (Sandbox Code Playgroud)
这表明查询构建接收正确的参数 (0)。注意 '%s' 不是标准格式的占位符,因为 Django 查询构建%s
是唯一的类型。
所以这一切看起来都是正确的。
这是怎么回事?
我追踪了它。就像最好的追踪一样,有点故事。
首先,我在backends/postgresql_psycopg2/base.py
in 中放置了一个断点,CursorWrapper.execute
并确定无法进入 with pdb
,因此它必须是一个 C 模块。
所以我搜索了确切的错误“不是字符类型”,这让我找到了tsvector
用于全文搜索的PostgreSQL 源代码。线路:
01419 if (!is_text_type(SPI_gettypeid(rel->rd_att, numattr)))
01420 ereport(ERROR,
01421 (errcode(ERRCODE_DATATYPE_MISMATCH),
01422 errmsg("column \"%s\" is not of a character type",
01423 trigger->tgargs[i])));
Run Code Online (Sandbox Code Playgroud)
在http://doxygen.postgresql.org/tsvector__op_8c_source.html 中找到
所以它试图从相关领域创建一个 tsvector。
所以我查看了模式,瞧,我有一个触发器。
Triggers:
MY_TRIGGER BEFORE INSERT OR UPDATE ON MY_TABLE FOR EACH ROW EXECUTE PROCEDURE tsvector_update_trigger('text_index', 'pg_catalog.english', 'X', 'Y', 'Z', 'provenance')
Run Code Online (Sandbox Code Playgroud)
我已经忘记了这件事。我不知道为什么它以前有效,然后停止工作,但这就是问题所在。
tl;dr 一个更新触发器正在构建一个tsvector
外地,并抱怨类型。数据或驱动程序没有任何问题,只是触发器执行了错误类型的数据。
归档时间: |
|
查看次数: |
248 次 |
最近记录: |