gpt4 book ai didi

Django Postgres 错误,字段 "is not of a character type"

转载 作者:行者123 更新时间:2023-12-01 23:04:52 27 4
gpt4 key购买 nike

这是健全性检查问题之一。这应该是非常明显的。要么是驱动程序出了问题,要么是我忽略了一些明显的事情。

我有一个 Django 模型字段。它是一个整数字段,非空,有选择。

PROVENANCE_X = 0
PROVENANCE_Y = 1

PROVENANCE_CHOICES = [
(PROVENANCE_X, "Provenance X"),
(PROVENANCE_Y, "Provenance Y")
]

在模型中:

provenance = models.IntegerField(choices=PROVENANCE_CHOICES, default=PROVENANCE_X)

只是为了检查一下,这是 Postgres 所说的:

provenance     | integer                 | not null

当我在管理员中保存模型时,出现错误。

DatabaseError
column "provenance" is not of a character type

没有自定义管理内容。错误完全出在 Django 代码中,但我不知道在哪里。我在 save 方法中放置了一个断点,只是为了在调用 super 之前进行检查:

(Pdb) print self.provenance
0

某处的某些代码是否试图插入字符而不是整数?

错误来自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',
)

这表明查询构建接收到正确的参数 (0)。注意,“%s”不是标准格式占位符,对于 Django 查询构建来说,%s 是唯一的类型。

所以看起来一切都是正确的。

发生什么事了?

最佳答案

我找到了它。就像最好的追踪一样,有一点故事。

首先我在 backends/postgresql_psycopg2/base.py 中放置了一个断点在CursorWrapper.execute并确定无法使用 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])));

发现于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')

我都忘了这件事了。我不知道为什么它之前有效,然后停止工作,但这就是问题所在。

tl;博士更新触发器正在构建 tsvector离开现场,并提示这种类型。数据或驱动程序没有任何问题,只是触发器执行了错误类型的数据。

关于Django Postgres 错误,字段 "is not of a character type",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14014280/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com