heroku,postgreSQL,django,comments,tastypie:没有操作符匹配给定的名称和参数类型.您可能需要添加显式类型转换

前端之家收集整理的这篇文章主要介绍了heroku,postgreSQL,django,comments,tastypie:没有操作符匹配给定的名称和参数类型.您可能需要添加显式类型转换前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个简单的查询 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解释为类型文本的值进行比较.

另一方面,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,所以我想我会给你的背景,希望你可以从那里拿走.

猜你在找的Postgre SQL相关文章