2011-02-02 93 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