2

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

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() 被数据库引用并解释为字符串而不是函数调用。

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

谢谢!

4

1 回答 1

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)

这看起来很可怕,可能会让你的皮肤爬行,但如果你看看 MySQLdb 正在做什么(在 /usr/lib/pymodules/python2.6/MySQLdb/cursors.py 中)cursors.executemany,我认为这是沿着与该函数正在执行的操作相同的行,减去由于正则表达式cursors.insert_values未正确解析嵌套括号而导致的混淆。(哎呀!)


我刚刚安装了 oursql,一个 MySQLdb 的替代品,我很高兴地报告

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

使用我们的sql按预期工作。

于 2011-02-02T21:42:58.430 回答