2011-02-02 45 views
2

当我尝试运行像语句调用因为它将括号视为值块的结尾。也就是说,查询看起来像:包括DB函数在python MySQLdb的executemany()

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

和MYSQL报告语法错误。相反,他们应该像:

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

应该有一些方法来逃避NOW(),但我无法弄清楚如何。向元组添加'NOW()'不起作用,因为NOW()被引用并被DB解释为字符串而不是函数调用。

通过使用当前时间戳作为缺省值解决这个工作是不是一种选择 - 这是一个例子,我需要做这样的事情具有多种功能分贝,而不仅仅是现在。

谢谢!

回答

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的在cursors.executemany是干什么的,我觉得这是沿着相同的路线是什么功能是干什么的,由于减去正则表达式cursors.insert_values的查询股价不能正确解析嵌套括号。 (伊克!)


我刚刚installed oursql,替代MySQLdb的,并很高兴地报告,

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

按预期工作与oursql。

+0

呸。我只是看了下面的代码。也有一些是错的正则表达式,这似乎是一个报告的bug: [链接](http://sourceforge.net/tracker/index.php?func=detail&aid=2137599&group_id=22307&atid=374932) – 2011-02-02 23:28:40