gpt4 book ai didi

django - heroku、postgreSQL、django、comments、tastypie : No operator matches the given name and argument type(s). 您可能需要添加显式类型转换

转载 作者:行者123 更新时间:2023-11-29 11:09:31 27 4
gpt4 key购买 nike

我对 django 的内置评论模型进行了一个简单的查询,并在 heroku 的 postgreSQL 数据库中得到了以下错误:

DatabaseError: operator does not exist: integer = text LINE 1: 
... INNER JOIN "django_comments" ON ("pi ns_pin"."id" = "django_...
^
HINT: No operator matches the given name and argument type(s).
You might need to add explicit type casts.

在谷歌搜索之后,这个错误似乎已经在 django 中解决了很多次,但我仍然得到它(所有相关问题都在 3-5 年前关闭)。我使用的是 django 1.4 版和最新版本的 tastypie。

查询是在 orm 过滤器下进行的,并且与我的开发数据库 (sqlite3) 完美配合:

class MyResource(ModelResource):    

comments = fields.ToManyField('my.api.api.CmntResource', 'comments', full=True, null=True)

def build_filters(self, filters=None):
if filters is None:
filters = {}

orm_filters = super(MyResource, self).build_filters(filters)

if 'cmnts' in filters:
orm_filters['comments__user__id__exact'] = filters['cmnts']

class CmntResource(ModelResource):
user = fields.ToOneField('my.api.api.UserResource', 'user', full=True)
site_id = fields.CharField(attribute = 'site_id')
content_object = GenericForeignKeyField({
My: MyResource,
}, 'content_object')
username = fields.CharField(attribute = 'user__username', null=True)
user_id = fields.CharField(attribute = 'user__id', null=True)

有人有在不编写原始 SQL 的情况下解决此错误的经验吗?

最佳答案

PostgreSQL 是“强类型”的——也就是说,每个查询中的每个值都有一个特定的类型,可以显式定义(例如表中列的类型)或隐式定义(例如输入到 WHERE 子句中的值) ).所有函数和运算符,包括 = , 必须定义为接受特定类型 - 因此,例如 VarChar = VarChar 有一个运算符, 和一个不同的 int = int .

在您的例子中,您有一个明确定义为类型 int 的列, 但您将其与 PostgreSQL 解释为类型 text 的值进行比较.

另一方面,SQLite 是“弱类型的”- 值被自由地视为最适合正在执行的操作的任何类型。所以在你的开发 SQLite 数据库中操作 '42' = 42可以很好地计算,其中 PostgreSQL 需要 VarChar = int 的特定定义(或 text = inttext 是 PostgreSQL 中无限字符串的类型)。

现在,PostgreSQL 有时 会有所帮助并自动“转换”您的值以使类型匹配已知的运算符,但更常见的是,正如提示所说,您需要明确地执行此操作。如果您自己编写 SQL,显式类型案例可能类似于 WHERE id = CAST('42' AS INT) (或 WHERE CAST(id AS text) = '42' )。

既然你不是,你需要确保你给查询生成器的输入是一个实际的整数,而不仅仅是一个恰好由数字组成的字符串。我怀疑这就像使用 fields.IntegerField 一样简单而不是 fields.CharField ,但我实际上并不了解 Django,甚至不了解 Python,所以我想我会向您介绍背景知识,希望您能从那里学习。

关于django - heroku、postgreSQL、django、comments、tastypie : No operator matches the given name and argument type(s). 您可能需要添加显式类型转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16044754/

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