2012-02-18 101 views
1

我正在嘗試使用cursor.execute(sql, args)語法將INSERT轉換爲MySQL。這就是我目前有:MySQL + Python:並非在字符串格式化過程中轉換的所有參數

# data = {...} 
qmarks = ', '.join('?' * len(data)) 
query = "INSERT INTO title (%s) VALUES (%s)" %(qmarks, qmarks) 
args = data.keys() + data.values() 
print len(args), print len(data) 
cursor.execute(query, args) 

TypeError: not all arguments converted during string formatting 

我檢查的args(22)和quarks(11×2 = 22)的長度,並且它們似乎是相同的。什麼導致了這個錯誤,我需要改變什麼?

更新:當我嘗試做字符串使用%s格式,它也拋出一個錯誤:

>>> data={'provider':'asdf', 'vendor_id': '1234'} 
>>> format = ', '.join(['%s'] * len(data)) 
>>> query = "INSERT INTO title (%s) VALUES (%s)" %(format, format) 
>>> query 
'INSERT INTO title (%s, %s) VALUES (%s, %s)' 
>>> cursor.execute(query, args) 
Traceback (most recent call last): 
raise errorclass, errorvalue 
_mysql_exceptions.ProgrammingError: (1064, "You have an error in your SQL syntax; 
check the manual that corresponds to your MySQL server version for the right syntax 
to use near ''vendor_id', 'provider') VALUES ('1234', 'asdf')' at line 1") 

我認爲這是與事實,列定義字符串做:

而不是
INSERT INTO title ('vendor_id', 'provider') VALUES ('1234', 'asdf') 

INSERT INTO title (vendor_id, provider) VALUES ('1234', 'asdf') 

有沒有辦法在這裏使用字符串格式,但通過變量而不是字符串?

回答

3

假設你正在使用MySQLdb的,你想擁有%s在最後的查詢,而不是?,你也將需要直接輸入列名到查詢,而不是使用%s替代他們的:

# data = {...} 
columns = ', '.join(data.keys()) 
format = ', '.join(['%s'] * len(data)) 
query = "INSERT INTO title (%s) VALUES (%s)" % (columns, format) 
cursor.execute(query, data.values()) 
+0

謝謝。我更新了字符串格式,但它仍然引發某種語法錯誤(參見上文)。 – David542 2012-02-18 00:24:17

+0

@ David542 - 我認爲這是由列名引起的,很確定您需要將字段列名直接插入到查詢中,然後只有'%s'替換值。所以它看起來像這樣:'INSERT INTO title(vendor_id,provider)VALUES(%s,%s)'。 – 2012-02-18 00:30:20

+0

但是後來我失去了'dict'的順序(在字典中我有大約100 k,v對) – David542 2012-02-18 00:36:26

相關問題