我们正在基于GNU Health在tryton中开发模块。我们收到以下错误:
ProgrammingError: operator does not exist character varying = bigint
Hint: No opreator matches the given name and argument type(s). You might need to add explicit type casts
答案 0 :(得分:4)
在此查询中,尽可能模糊地猜测提供的有限信息:
"SELECT name,age,dob,address FROM TABLENAME WHERE pmrn=%s" % (self.pmrn)
您似乎正在对查询执行值的字符串替换。
首先,this is dangerously wrong,如果没有极其的充分理由,你永远不应该这样做。 始终 use parameterized queries。 psycopg2
支持这些,所以没有理由不这样做。对于PostgreSQL的所有其他Python接口也是如此,但我假设您使用psycopg2
,因为基本上每个人都这样做,所以请阅读the usage documentation以了解如何传递查询参数。
其次,由于未能使用参数化查询,您无法通过数据类型处理从数据库驱动程序获得任何帮助。您提到pmrn
类型为char
- 我认为您的意思是varchar
;如果它实际上是char
那么数据库设计者需要被放在一边进行坚定的交谈。无论如何,如果你在那里替换一个不带引号的数字,你的查询将会是这样的:
pmrn = 201401270001
如果pmrn
是varchar
那将是一个错误,因为您无法直接将文本类型与数字进行比较。您必须将值作为文本传递。简单的方法是在它周围加上引号:
pmrn = '201401270001'
但您应该做的是让psycopg2
使用参数化查询来处理所有这些问题。 E.g。
curs.execute("SELECT name,age,dob,address FROM TABLENAME WHERE pmrn=%s", (self.pmrn,))
即。将SQL查询作为字符串传递,然后是包含查询参数的1元组。 (如果它是一个int,你可能需要将self.pmrn
转换为str
,例如str(self.pmrn)
)。