psycopg2 TypeError:在字符串格式化期间不是所有参数都被转换

时间:2014-02-03 10:12:23

标签: python trac psycopg2

我正在尝试执行一个简单的查询,但无论我如何传递参数,都会收到此错误。

这是查询(我使用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会导致同样的错误。

5 个答案:

答案 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'])
在对数据库进行编程之前,应该要求

Rules for DB API usage阅读。

答案 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'])
)