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

当我尝试运行如下语句时:
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函数来做这种事情,而不仅仅是现在。 谢谢!     
已邀请:
下面的方法远非理想,但不幸的是,这是我所知道的唯一方法。 我的想法是手动构造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中)在MySQL5正在做什么,我认为这是沿着与函数正在执行的行相同,减去由于正则表达式未正确解析嵌套括号而导致的混淆。 (伊克!) 我刚刚安装了我的MySQL,MySQLdb的替代品,我很乐意报告
sql='INSERT INTO `foo` (`fooid`,`data`,`time_added`) VALUES (?,?,NOW())'
cursor.executemany(sql,args)
使用oursql按预期工作。     

要回复问题请先登录注册