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

"Too few parameters" error with list of values for IN condition

我正在使用 pyodbc 模块从 Python 查询 MS Access 数据库。如果我查询 table 中的所有记录,我可以执行此操作,但是当我添加 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