我有一个简单的查询
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)
Postgresql是“强类型” – 也就是说,每个查询中的每个值都具有明确定义的特定类型(例如,表中列的类型)或隐式(例如,输入到WHERE子句的值).所有函数和运算符(包括=)都必须被定义为接受特定类型 – 所以例如有一个VarChar = VarChar的运算符,另外一个用于int = int.
在您的情况下,您有一个明确定义为int类型的列,但是您将其与Postgresql解释为类型文本的值进行比较.
另一方面,sqlite是“弱类型” – 值被自由地视为最适合正在执行的动作的任何类型的值.所以在你的开发sqlite数据库中,操作’42’= 42可以计算得很好,其中Postgresql需要VarChar = int的特定定义(或text = int,文本是Postgresql中的无界字符串的类型).
现在,Postgresql有时会有所帮助,并自动地“转换”你的值,使这些类型与一个已知的运算符匹配,但是更多的时候,正如提示所说,你需要明确地做.如果你自己编写sql,那么显式类型的情况可能看起来像WHERE id = CAST(’42’AS INT)(或者WHERE CAST(id AS text)=’42’).
既然你不是,你需要确保你给查询生成器的输入是一个实际的整数,而不仅仅是一个字符串,它恰好包含数字.我怀疑这是一样简单的使用fields.IntegerField而不是fields.CharField,但我实际上并不知道Django,甚至Python,所以我想我会给你的背景,希望你可以从那里拿走.