2016-03-04 84 views
2

使用新購買的RaspberryPi,我對Python/MySQL非常陌生,所以請原諒我發佈的天真問題。 我已經看過很多Q & A,但我似乎無法理解'爲什麼'這是失敗的。我得到錯誤:「必須是字符串或只讀緩衝區,而不是元組」。如果我用TYPE測試它,我的變量顯示爲一個字符串,所以現在我迷路了。將字符串變量傳遞給MySQL,失敗爲元組

import MySQLdb 
import time 
db = MySQLdb.connect(host="localhost", user="user",passwd="easypwd", db="imagepi") 
cursor = db.cursor() 
current_time = time.strftime("%H:%M:%S") 
current_date = time.strftime("%Y-%m-%d") 
filename = (current_time+'.jpg') 
sql = ("""INSERT INTO imagelocator(batch, date, time, filename) VALUES 
('1001', current_date, current_time, %s)""", filename) 
cursor.execute(sql) 
db.commit() 
db.close() 

非常感謝您爲我提供了一個正確的方向。

回答

1

sql變量是一個元組。其中一半是你的SQL語句,另一半是你的語句中%s參數的標記值。然而,簡單地將一個元組傳遞給一個參數並不會將其分開,並將元組中的每個元素作爲一個單獨的參數使用。爲此,您必須使用星號:function_to_call(*tuple_args) ...但我認爲您也會遇到問題,因爲數據庫光標需要參數statement的字符串以及參數parameters的序列。參數parameters必須是一個序列(元組,列表,集合等),即使只有一個值

TL; DR - 你需要做更多的事情是這樣的:

sql = "INSERT INTO table_name (a_column, b_column) VALUES ('asdf', %s)" 
args = (filename,) 
cursor.execute(sql, args) 

...或者,如果你真的想成爲調皮,並使用一個元組的一切:

sql = ("INSERT INTO table_name (a_column, b_column) VALUES ('asdf', %s)", (filename,)) 
cursor.execute(*sql) 

編輯:我想我沒有澄清......而用圓括號包圍一個字符串不會創建一個元組,添加一個逗號確實是。所以,(string_var)不是元組,而(string_var,)是。希望這可以消除上述代碼運作方式的混亂。

另外,這裏有一些關於星號的東西的文檔;既枯燥的官方文檔和更容易理解的博客文章:

+0

我很欣賞你的快速反應。讓我重新閱讀幾遍,並查看您提供的鏈接。我相信這會使我走上正確的道路。謝謝! – generatorlabs

+0

總是樂於提供幫助。 – haliphax