python - "Too few parameters"IN 条件值列表错误

标签 python sql parameters pyodbc

我正在使用 pyodbc 模块从 Python 查询 MS Access 数据库。如果我查询表中的所有记录,我就可以执行此操作,但是当我添加 where 子句时,我收到错误。

这是我的代码:

wpc_ids = ['WPCMOOTEST2', 'WPCMOOTEST1']
conn = pyodbc.connect(r'Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=P:\Conservation Programs\Natural Heritage Program\Data Management\ACCESS databases\POND_entry\POND_be.accdb;')
cursor = conn.cursor()
wpc_list = ','.join(str(x) for x in wpc_ids)
cursor.execute('SELECT * FROM pools WHERE wpc_id IN (%s)'%wpc_list)

我收到以下错误:

Error: ('07002', u'[07002] [Microsoft][ODBC Microsoft Access Driver] Too few parameters. Expected 2. (-3010) (SQLExecDirectW)')

如果没有 where 子句,我不会收到该错误,因此我不确定我需要的第二个参数是什么。谁能帮忙解决这个问题吗?

最佳答案

cursor.execute(
    'SELECT * FROM pools WHERE wpc_id IN ({})'.format(
        ','.join('?'*len(wpc_ids))), wpc_ids
)

说明:

有一个关于数据库的PEP,PEP249,你可以在这里阅读 https://www.python.org/dev/peps/pep-0249/

此 PEP 定义了数据库模块的 API 应该如何。 pyodbc是您正在使用的数据库模块,它与 PEP249 兼容。

PEP 定义的一件事是每个模块应该有一个 paramstylepyodbc.paramstyleqmark这就是为什么你使用 '?'与 pyodbc。更多详情https://www.python.org/dev/peps/pep-0249/#paramstyle

现在,我们的想法不是将查询构建为字符串并将其发送到数据库,而是使用参数传递,这是一种单独发送查询和参数的方法...它使用 paramstyle将占位符放入查询中,然后将一系列参数作为第二个参数传递给 execute 。示例:

sql = 'SELECT * FROM foo WHERE id = ? AND text_col = ?'
params = (12, 'testing')
cursor.execute(sql, params)

请注意,这不会将参数与字符串混合。代码将它们作为两个单独的参数传递给 .execute() 。这意味着安全地进行插值将是数据库的工作。

由于要向查询传递多个值,因此必须生成一个字符串,其中包含以逗号分隔的占位符数量,与列表中的元素数量相同:

','.join('?'*len(wpc_ids)))  
 # will generate ?,?,?,?,? according with length of list

关于python - "Too few parameters"IN 条件值列表错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51048963/

相关文章:

python - Django 应用程序无法与 ms sql server 2014 连接

python - 最小化计算时间(即 : "print" slows it down)

sql - 在 IN 子句中使用逗号分隔的参数

sql - SSIS 包不想获取临时表的元数据

javascript - 如何通过 JSON 传递函数名称并在 javascript/jQuery 中调用它?

c# - 可选参数后跟 Params

python - 在 Python 中保存到 .msg 文件,或者将邮件发送到文件系统

python - 如何在Python中反转4字节常量的字节顺序?

mysql - 复杂的sql语句,里面有4个条件

url - 为什么Google搜索会使用客户端网址参数?