如何确保Python3将数字推断为字符串而不是整数?

时间:2018-05-09 18:39:40

标签: python-3.x postgresql psycopg2

我这里有一行代码:

query = """SELECT v.retailiqpo_ordernumber 
    FROM public.vmi_purchase_orders v
    WHERE v.vendor_account = {}""".format(str(primary_account_number))

我试图加载数字的字符串值,但psycopg2仍然会抛出此错误。

psycopg2.ProgrammingError: operator does not exist: character varying = integer

我有什么选择来确保Psycopg2将其视为字符串?或者我应该只将数据库的整体结构更改为整数?

2 个答案:

答案 0 :(得分:2)

让psycopg2为您插入查询参数(几乎)总是更好。 (http://initd.org/psycopg/docs/usage.html#the-problem-with-the-query-parameters

query = """SELECT v.retailiqpo_ordernumber 
    FROM public.vmi_purchase_orders v
    WHERE v.vendor_account = %s"""

cur.execute(query, (str(primary_account_number),))

这样psycopg2将根据传递的python值的类型处理正确的类型格式。

答案 1 :(得分:1)

使用

query = """
SELECT v.retailiqpo_ordernumber 
FROM public.vmi_purchase_orders v 
WHERE v.vendor_account = '{}'
""".format(primary_account_number)

这样查询中的数字就会作为字符串传递 - 如果c.vendor_account 的字符串类型(varchar ie)。重要的部分是'之前/之后{},因此查询字符串将其视为字符串。

正如Jon Clements所指出的那样,最好让api处理转换:

query = """
SELECT v.retailiqpo_ordernumber 
FROM public.vmi_purchase_orders v 
WHERE v.vendor_account = %s
"""

cursor.execute(query, (str(primary_account_number),)

Doku:Psycopg - Passing parameters to sql queries