我正在使用 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 定义的一件事是每个模块应该有一个 paramstyle
。 pyodbc.paramstyle
是 qmark
这就是为什么你使用 '?'
与 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/