在python MySQLdb executemany()中包含DB函数调用

时间:2011-02-02 20:39:04

标签: python mysql function executemany

当我尝试运行如下语句时:

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()'添加到元组不起作用,因为然后NOW()被DB引用并解释为字符串而不是函数调用。

通过使用当前时间戳作为默认值来解决这个问题不是一个选项 - 这是一个例子,我需要使用各种db函数来做这类事情,而不仅仅是现在。

谢谢!

1 个答案:

答案 0 :(得分:1)

下面的方法远非理想,但不幸的是,这是我所知道的唯一方法。

我的想法是手动构造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在{{1}我认为这与函数正在执行的操作相同,减去由于正则表达式cursors.executemany未正确解析嵌套括号而导致的混淆。 (EEK!)


我只是installed oursql,是MySQLdb的替代品,我很乐意报告

cursors.insert_values

与oursql一起工作。