当我尝试运行如下语句时:
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函数来做这类事情,而不仅仅是现在。
谢谢!
答案 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一起工作。