快速下载:
这里的想法是从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)")
任何帮助将不胜感激。
答案 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))