Executemany混淆

问题描述:

好的,所以我有一个函数,根据插件的输入选择sqlite数据库中的某些行。当只涉及一个语句时,我得到插件来选择和提取行,但由于我想为此添加一些灵活性,我试图在遇到列表或元组时使用executemany。然而,尽管我已经搞清楚和改变了所有的东西,但我仍然无法得到它的工作,因为sqlite语句将字符串中的每个字符视为绑定,或者因为元组中绑定太多。这里是我到目前为止的代码:Executemany混淆

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) 
+1

'vartype = type(name)'是'vartype = type(offset)'? – unutbu 2010-11-04 20:42:43

+0

呃,是的,它应该是 – Varriount 2010-11-04 20:49:10

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]) 
+0

@Adam Bernier的变体(带有占位符生成)看起来更好,因为它有助于防止SQL注入。只有'offset'中的所有值都是整数时,您才可以使用我的代码 – seriyPS 2010-11-04 20:58:40

+1

'isinstance(offset,(tuple,list))'也起作用。 – unutbu 2010-11-04 21:11:48

+0

@unutbu:是的,修好了!谢谢! – seriyPS 2010-11-04 21:21:24

我认为您不需要executemany这里。
尝试这样的事情,而不是:

self.memcursor.execute('''SELECT id, matbefore, matafter, name, date 
          FROM main 
          WHERE name IN (%s)''' % 
         ','.join('?'*len(offset)), (offset,)) 

注意,串插做是为了多个占位符放入查询。