2015-03-31 60 views
0

如何執行mysqldb插入不同參數? 的例子說:Python MYSQLdb如何執行插入不同參數

add_employee = ("INSERT INTO employees " 
       "(first_name, last_name, hire_date, gender, birth_date) " 
       "VALUES (%s, %s, %s, %s, %s)") 

data_employee = ('Geert', 'Vanderkelen', tomorrow, 'M', date(1977, 6, 14)) 

cursor.execute(add_employee, data_employee) 

我想要做的就是

cursor.execute("INSERT INTO %s (%s) VALUES (%s)", ('animals', 'name', 'fox')) 

,但我得到了一個錯誤

MySQL Error [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 ''animals' ('name') VALUES ('fox')' at line 1 

我明白MySQLdb的的格式化工作錯了,是有一種方法來解決這個問題?而且,是它在某種程度上可以做到這樣的事情

cursor.execute("INSERT INTO %s (%s) VALUES (%s)", ('animals', ('name','color'), ('fox', 'orange')) 

編輯:請不要立足於假定所有插入的數據會串你的答案。我也希望能夠通過BLOB數據與這些查詢

imageofafox = open('fox.jpg', 'rb').read() 
sql = "INSERT INTO %s (%s) VALUES (%s)" 
cursor.execute(sql, ('animals', 'name, picture', ('fox', imageofafox))) 

回答

0

cursor.execute會自動報價均爲給出的參數,所以您的查詢最初已經不能工作,因爲這裏提到的:)

只有在使用蟒蛇集結在表名和字段名%代替,,那麼你應該換你的價值在',以確保:

cursor.execute("INSERT INTO %s (%s) VALUES (%s)" % ('animals', 'name', "'fox'")) 

,如果你想包含多個字段和值記住你是將它們作爲三串(也號碼和鄰療法值是自動報價MySQL將處理的數據類型):

cursor.execute("INSERT INTO %s (%s) VALUES (%s)" % ('animals', 'name, color', "'fox', 'orange'")) 

可以測試結果與印刷和%

print "INSERT INTO %s (%s) VALUES (%s)" % ('animals', 'name, color', "'fox', 'orange'") 

據我雖然知道,你不能傳遞數組作爲一個參數執行,只有一個參數列表,所以('animals', ['name', 'color'], ...將無法​​正常工作!

下面是測試,並找出爲什麼它不會在你的環境中工作,一個完整的腳本,因爲它肯定在我做:

import mysql.connector 

connection = mysql.connector.connect(user='root', password='', host='127.0.0.1', database='test') 
cursor = connection.cursor() 
sql = "INSERT INTO %s (%s) VALUES (%s)" 
arg = ('animals', 'name', "'fox'") 

cursor.execute('set profiling = 1') 
try: 
    cursor.execute(sql % arg) 
    connection.commit() 
except: 
    cursor.execute('show profiles') 
    for row in cursor: 
     print(row) 
    raise 

connection.close() 

說明:如果您使用cursor.execute(sql, args)然後該函數將自動引用所有值。由於你的SQL不僅包含%s的值,還包含表名和字段名,所以你不能讓它們被自動引用,否則SQL將失敗。如果您使用cursor.execute(sql % args),則必須自行將引號添加到您的值中,但是您的查詢不會失敗,因爲不會引用表名和字段名稱。

+0

不工作時,你的第一個代碼產生 MySQL錯誤[1064]:您的SQL語法錯誤;檢查與您的MySQL服務器版本相對應的手冊,在第1行 – 2015-03-31 18:03:47

+0

處使用''animals'('name')VALUES('\'fox \'')'附近的正確語法。對不起,忘記了光標的自動引用執行,因爲我使用它與%和不與,所以錯誤是其他地方... – 2015-03-31 18:11:59

+0

我最初的查詢沒有工作,因此在問題 – 2015-03-31 18:45:40

0

//編輯:這本來是爲Java mysql的東西

你的數據是錯誤的類型,你需要字符串或數值類型內數據元組。

//data_employee = ('Geert', 'Vanderkelen', tomorrow, 'M', date(1977, 6, 14)) 
data_employee = ('Geert', 'Vanderkelen', 'no idea what tomorrow was', 'M', 'date(1977, 6, 14)') 
0

如果您的示例正在工作,您可以使用它作爲您的首選。

add_animals = ("INSERT INTO %s " 
       "(%s) " 
       "VALUES (%s)") 
data_animals = ('animals', 'name', 'fox') 
cursor.execute(add_animals, data_animals) 

確保數據致力於利用數據庫commit()

+0

我的示例不起作用,因此錯誤在問題中提到 – 2015-03-31 17:59:12