Executemany混乱
Posted
技术标签:
【中文标题】Executemany混乱【英文标题】:Executemany confusion 【发布时间】:2011-05-05 07:18:15 【问题描述】:好的,所以我有一个函数可以根据插件的输入选择 sqlite 数据库中的某些行。当只涉及一个语句时,我让插件选择和获取行,但由于我想为此增加一些灵活性,我尝试在遇到列表或元组时使函数使用 executemany。然而,尽管我已经摆弄和改变了所有的东西,我仍然无法让它工作,要么是因为 sqlite 语句将字符串中的每个字符都视为一个绑定,要么是因为元组中有太多的绑定。这是我到目前为止的代码:
def readoffset(self,offset):
vartype = type(name)
print(vartype)
if vartype == int:
self.memcursor.execute('''select all id,matbefore,matafter,name,date
from main as main where id = ?''',[offset])
undolist = self.memcursor.fetchall()
print(undolist)
return(undolist)
elif vartype == tuple or list:
print(vartype)
self.memcursor.executemany('''select all id,matbefore,matafter,name,date
from main as main where name = (?)''', [offset])
undolist = self.memcursor.fetchall()
return(undolist)
【问题讨论】:
应该vartype=type(name)
是vartype=type(offset)
?
【参考方案1】:
我认为您在这里不需要executemany
。
试试这样的:
self.memcursor.execute('''SELECT id, matbefore, matafter, name, date
FROM main
WHERE name IN (%s)''' %
','.join('?'*len(offset)), (offset,))
注意,字符串插值是为了在查询中放置多个占位符。
【讨论】:
【参考方案2】:看http://www.python.org/dev/peps/pep-0249/
使用此方法进行操作 产生一个或 更多的结果集构成未定义的行为,并且 允许实施
因此,executemany 可用于 INSERT 和 UPDATE,但不能用于 SELECT
你可以试试下面的代码:
elif isinstance(offset, (tuple, list)):
offsets=', '.join(offset)
self.memcursor.execute('''select all id,matbefore,matafter,name,date
from main as main where name IN (?)''', [offsets])
【讨论】:
@Adam Bernier 的变体(带有占位符生成)看起来更好,因为它有助于防止 SQL 注入。只有当offset
中的所有值都是整数时,您才能使用我的代码
很酷的一点是isinstance(offset,(tuple,list))
也可以工作。
@unutbu:是的,已修复!谢谢!以上是关于Executemany混乱的主要内容,如果未能解决你的问题,请参考以下文章
在 sql.executemany(... '(' 附近的语法错误
如何使用 executemany 处理异常(MySQL 和 Python)