Pyodbc:如何将元组作为查询参数?

时间:2018-07-27 15:28:55

标签: python sql ms-access pyodbc

快速下载:

这里的想法是从csv文件中读取一些数据,并将其用作我的sql查询的NOT IN部分中的列表。我正在使用下面的代码连接到数据库(.mdb)。 注意LP是我要传递的元组/列表,IRdb是数据库的路径

constr = r'Driver={Microsoft Access Driver (*.mdb, *.accdb)};Dbq=' + IRdb
conn = pyodbc.connect(constr, autocommit=True)
cur = conn.cursor()

IRsql='''SELECT IRRPResults.RRPName, IRRPResults.PointName, IRRPResults.RiskPerTime FROM IRRPResults 
WHERE IRRPResults.PointName<>? 
AND IRRPResults.RRPName NOT LIKE ? AND IRRPResults.PointName NOT IN ?'''

cur.execute(IRsql,('Total',r'Conn%',LP))

问题:

除了execute语句(在我添加NOT IN部分之前它确实起作用)之外,其他所有方法都工作正常。我尝试将LP作为字符串,元组和列表进行传递,但似乎没有任何效果。我收到以下错误

pyodbc.ProgrammingError: ('42000', "[42000] [Microsoft][ODBC Microsoft Access Driver] In operator without () in query expression 'IRRPResults.PointName<>Pa_RaM000 AND IRRPResults.RRPName NOT LIKE Pa_RaM001 AND IRRPResults.PointName NOT IN Pa_RaM002'. (-3100) (SQLExecDirectW)")

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:2)

对于任何有兴趣的人,或者对于从现在开始读这两年有同样问题的那个人,或者对于我未来的自我,当我忘记所做的事情时,我已经找到了一个或两个解决方案。

第一个解决方法是在传递给execute语句之前,直接在sql字符串上使用.format来插入LP

IRsql='''SELECT IRRPResults.RRPName, IRRPResults.PointName, IRRPResults.RiskPerTime FROM IRRPResults 
WHERE IRRPResults.PointName<>? 
AND IRRPResults.RRPName NOT LIKE ? AND IRRPResults.PointName NOT IN {}'''.format(LP)

cur.execute(IRsql,('Total',r'Conn%'))

我从this question获得的另一种解决方案更加优雅和巧妙,因为它构建了一个字符串“?”。 LP中每个元素的标记。然后,LP作为元组/列表传递给execute语句。

placeholders=','.join('?'*len(LP))
IRsql='''SELECT IRRPResults.RRPName, IRRPResults.PointName, IRRPResults.RiskPerTime FROM IRRPResults 
WHERE IRRPResults.PointName<>? 
AND IRRPResults.RRPName NOT LIKE ? AND IRRPResults.PointName NOT IN ({})'''.format(placeholders)

cur.execute(IRsql,('Total',r'Conn%',*LP))