批量执行困惑

0 投票
2 回答
3235 浏览
提问于 2025-04-16 06:34

好的,我有一个函数,它根据插件的输入从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)

2 个回答

3

我觉得你这里不需要用到 executemany
可以试试下面这样的写法:

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

注意,这里用字符串插值的方式把多个占位符放进查询里。

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

撰写回答