Executemany путаница - PullRequest
       10

Executemany путаница

0 голосов
/ 04 ноября 2010

Хорошо, у меня есть функция, которая выбирает определенные строки в базе данных 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 ]

5 голосов
/ 04 ноября 2010

Посмотрите на http://www.python.org/dev/peps/pep-0249/

Использование этого метода для операции который производит один или большее количество наборов результатов представляет собой неопределенное поведение, и реализация разрешена

Таким образом, executemany может использоваться для вставки и обновления, но не для 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])
3 голосов
/ 04 ноября 2010

Я не думаю, что вам нужно executemany здесь.
Попробуйте что-то вроде этого:

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

Обратите внимание, что интерполяция строк выполняется для размещения нескольких заполнителей в запросе.*

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...