GnuHealth项目中“运算符不存在字符变化= bigint”

时间:2014-01-25 10:29:52

标签: python-2.7 postgresql-9.1

我们正在基于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 

1 个答案:

答案 0 :(得分:4)

在此查询中,尽可能模糊地猜测提供的有限信息:

"SELECT name,age,dob,address FROM TABLENAME WHERE pmrn=%s" % (self.pmrn)

您似乎正在对查询执行值的字符串替换

首先,this is dangerously wrong,如果没有极其的充分理由,你永远不应该这样做。 始终 use parameterized queriespsycopg2支持这些,所以没有理由不这样做。对于PostgreSQL的所有其他Python接口也是如此,但我假设您使用psycopg2,因为基本上每个人都这样做,所以请阅读the usage documentation以了解如何传递查询参数。

其次,由于未能使用参数化查询,您无法通过数据类型处理从数据库驱动程序获得任何帮助。您提到pmrn类型为char - 我认为您的意思是varchar;如果它实际上是char那么数据库设计者需要被放在一边进行坚定的交谈。无论如何,如果你在那里替换一个不带引号的数字,你的查询将会是这样的:

pmrn = 201401270001

如果pmrnvarchar那将是一个错误,因为您无法直接将文本类型与数字进行比较。您必须将值作为文本传递。简单的方法是在它周围加上引号:

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))。