我正在尝试执行一个简单的查询,但无论我如何传递参数,都会收到此错误。
这是查询(我使用Trac db对象连接到DB):
cursor.execute("""SELECT name FROM "%s".customer WHERE firm_id='%s'""" % (schema, each['id']))
架构和每个['id']都是简单的字符串
print("""SELECT name FROM "%s".customer WHERE firm_id='%s'""" % (schema, each['id']))
结果:
SELECT name FROM "Planing".customer WHERE firm_id='135'
错误是在firm_id=
之后删除引用,但该方式参数被视为整数,而::text
会导致同样的错误。
答案 0 :(得分:8)
我得到了同样的错误,并且在我的生活中无法解决如何修复,最终这是我的愚蠢错误,因为我没有足够的参数匹配元组中的元素数量:
con.execute("INSERT INTO table VALUES (%s,%s,%s,%s,%s)",(1,2,3,4,5,6))
请注意,我在要插入表中的值中有5个元素,但在元组中有6个元素。
答案 1 :(得分:6)
您不应该使用字符串插值在数据库查询中传递变量,但使用字符串插值来设置表名是正常的(只要它不是外部输入或限制允许值)。尝试:
cursor.execute("""SELECT name FROM %s.customer WHERE firm_id=%%s""" % schema, each['id'])
在对数据库进行编程之前,应该要求
答案 2 :(得分:5)
在我的情况下,我没有意识到您必须将一个元组传递给cursor.execute。我有这个:
def compose(f,g):
def _(x):
return f(g(x))
return _
def ident(x):
return x
def map(iterable, *callbacks):
f = functools.reduce(compose, callbacks, ident)
return map(f, iterable)
但是我需要通过一个元组
cursor.execute(query, (id))
答案 3 :(得分:3)
在SQL命令中传递变量的正确方法是使用execute()
方法的第二个参数。我认为你应该从第二个参数中删除单引号,在这里阅读 - http://initd.org/psycopg/docs/usage.html#the-problem-with-the-query-parameters。
请注意,您无法将表名作为参数传递给execute
,并且它被认为是不好的做法,但有一些解决方法:
Passing table name as a parameter in psycopg2
psycopg2 cursor.execute() with SQL query parameter causes syntax error
要传递表名,请尝试:
cursor.execute("""SELECT name FROM "%s".customer WHERE firm_id=%s""" % (schema, '%s'), (each['id'],))
答案 4 :(得分:2)
使用AsIs
from psycopg2.extensions import AsIs
cursor.execute("""
select name
from %s.customer
where firm_id = %s
""",
(AsIs(schema), each['id'])
)