我正在使用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子句我不会收到该错误,因此我不确定我需要的第二个参数是什么。有人可以帮忙吗?
答案 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定义的一件事是每个模块都应该有一个paramstyle
。 pyodbc.paramstyle
是qmark
,因此将'?'
与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()