0

好的,所以我有一个函数可以根据插件的输入选择 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)
4

2 回答 2

5

看看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])
于 2010-11-04T20:50:41.927 回答
3

我认为你不需要executemany这里。
尝试这样的事情:

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

请注意,字符串插值是为了将多个占位符放入查询中。

于 2010-11-04T20:43:06.443 回答