Включение вызовов функций БД в Python MySQLdb executemany () - PullRequest
2 голосов
/ 02 февраля 2011

Когда я пытаюсь запустить операторы вроде:

cursor.executemany("""INSERT INTO `test` (`id`,`data`,`time_added`) 
                      VALUES (%s, %s, NOW())""", [(i.id, i.data) for i in items])

MySQLdb, похоже, перекрывает) в NOW (), когда он расширяет список строк, которые нужно вставить, потому что он видит эту скобку как конец блока значений. То есть запросы выглядят так:

('1', 'a', NOW(), ('2','b', NOW(), ('3','c',NOW())

И MYSQL сообщает о синтаксической ошибке. Вместо этого они должны выглядеть так:

('1', 'a', NOW()), ('2','b', NOW()), ('3','c',NOW())

Должен быть какой-то способ избежать СЕЙЧАС (), но я не могу понять, как. Добавление 'NOW ()' в кортеж не работает, потому что тогда NOW () цитируется и интерпретируется БД как строка, а не как вызов функции.

Обойти это, используя текущую временную метку в качестве значения по умолчанию, не вариант - это пример, мне нужно делать подобные вещи с различными функциями БД, не только сейчас.

Спасибо!

1 Ответ

1 голос
/ 03 февраля 2011

Метод, описанный ниже, далек от идеала, но, к сожалению, это единственный известный мне способ.

Идея состоит в том, чтобы вручную создать SQL, используя connection.literal для экранирования аргументов:

cursor=connection.cursor()
args=[(1,'foo'),(2,'bar')]
sql=('INSERT INTO `foo` (`fooid`,`data`,`time_added`) VALUES '
     +','.join(
         ['(%s,%s,NOW())'%connection.literal(arg)
          for arg in args]))
cursor.execute(sql)

Это выглядит ужасно и может заставить вашу кожу ползти, но если вы загляните под капот (в /usr/lib/pymodules/python2.6/MySQLdb/cursors.py) то, что MySQLdb делает в cursors.executemany Я думаю, что это то же самое, что и то, что делает эта функция, за исключением путаницы из-за того, что регулярное выражение cursors.insert_values неправильно обрабатывает вложенные скобки. (Крон!)


Я только что установил oursql , альтернативу MySQLdb, и рад сообщить, что

sql='INSERT INTO `foo` (`fooid`,`data`,`time_added`) VALUES (?,?,NOW())'
cursor.executemany(sql,args)

работает как и ожидалось с oursql.

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