python psycopg2类型错误:在字符串格式化期间未转换所有参数[重复]

dphi5xsq  于 2023-04-04  发布在  Python
关注(0)|答案(7)|浏览(183)

此问题在此处已有答案

How to use variables in SQL statement in Python?(5个答案)
Why do I get "TypeError: not all arguments converted during string formatting" when trying to use a string in a parameterized SQL query?(8个答案)
4小时前关门了。
我尝试执行一个简单的查询,但无论我如何传递参数都得到此错误。
下面是查询(我使用Trac db对象连接到数据库):

cursor.execute("""SELECT name FROM "%s".customer WHERE firm_id='%s'""" % (schema, each['id']))

schema和each['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会导致同样的错误。

nqwrtyyt

nqwrtyyt1#

在我的例子中,我没有意识到你必须向cursor.execute传递一个元组。我有这个:

cursor.execute(query, (id))

但我需要传递一个元组

cursor.execute(query, (id,))
ubof19bj

ubof19bj2#

我得到了这个相同的错误,并且无法为我的生活工作如何修复,最后这是我的错误,因为我没有足够的参数匹配元组中的元素数量:

con.execute("INSERT INTO table VALUES (%s,%s,%s,%s,%s)",(1,2,3,4,5,6))

请注意,我要插入到表中的值中有5个元素,但元组中有6个元素。

z9gpfhce

z9gpfhce3#

建议不要使用字符串插值来传递数据库查询中的变量,但使用字符串插值来设置表名是可以的,只要它不是外部输入或您限制了允许的值。

cursor.execute("""
    SELECT name FROM %s.customer WHERE firm_id=%%s
    """ % schema, (each['id'],))

API使用规则为针对数据库进行编程提供了指导。

mcvgt66p

mcvgt66p4#

使用AsIs

from psycopg2.extensions import AsIs

cursor.execute("""
    select name 
    from %s.customer 
    where firm_id = %s
    """, 
    (AsIs(schema), each['id'])
)
nwnhqdif

nwnhqdif5#

你可以试试这个:

cursor.execute("INSERT INTO table_name (key) VALUES(%s)",(value1,))

如果在value1之后缺少(,),则会出现错误。

os8fio9y

os8fio9y6#

在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'],))
tnkciper

tnkciper7#

每次我有这样的错误,我是传递错误数量的值。尝试检查它

相关问题