IN条件值列表出现“参数太少”错误

时间:2018-06-26 17:58:19

标签: 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子句我不会收到该错误,因此我不确定我需要的第二个参数是什么。有人可以帮忙吗?

1 个答案:

答案 0 :(得分:2)

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

现在,与其将查询构建为字符串并将其发送到数据库,不如使用参数传递,这是一种分别发送查询和参数的方法……它使用{{1} }以在查询中放置占位符,然后将一系列参数作为第二个参数传递给paramstyle。示例:

execute

请注意,这不会将参数与字符串混合。代码将它们作为两个单独的参数传递给sql = 'SELECT * FROM foo WHERE id = ? AND text_col = ?' params = (12, 'testing') cursor.execute(sql, params) 。这意味着安全地进行插值将是数据库的工作。

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

.execute()