2013-04-23 58 views
1

我試圖將一個整數,一個字符串和一個列表作爲單個記錄插入到數據庫中,但是正在引發錯誤。TypeError:在使用參數插入時,並非所有在字符串格式化過程中轉換的參數

這裏是我的代碼:

values=nprnd.randint(10, size=48) #NUMPY ARRAY 
valuelist= map(None, values); #Convert to list 
guid=''.join(random.choice(string.ascii_uppercase + string.digits) for x in range(20)) #Generate guid 
for x in range(4): 
    var_string = ', '.join('?' * 48) 
    valuelist.insert(0,x) 
    valuelist.insert(0,ent_guid) 
    #50 coloums in table, guid, x and 48 randomly generated values 
    query_string = 'INSERT INTO schema1 VALUES (%s,%d,%s);' % (guid, x, var_string) 
    cursor.execute(query_string, valuelist) 

我不斷收到一個錯誤說:

Traceback (most recent call last): 
    File "script.py", line 19, in <module> 
    cursor.execute(query_string, valuelist) 
    File "/Library/Python/2.7/site-packages/MySQL_python-1.2.4b4-py2.7-macosx-10.8-intel.egg/MySQLdb/cursors.py", line 184, in execute 
    query = query % db.literal(args) 

我知道這個錯誤的原因(即使如此,對相同的錯誤了幾個問題)但沒有我嘗試瞭解決方案已經解決了這個錯誤,我

任何幫助,將不勝感激

+0

如果你需要生成一個GUID,你應該真的使用UUID模塊......它就是爲了這個目的。我建議'從uuid導入uuid4; guid = uuid4()。hex' – Endophage 2013-04-23 15:10:23

+0

與我目前的問題無關,但感謝您的提示! :) – navinpai 2013-04-23 15:11:21

+0

@navinpal確實是這樣,但看到我的答案爲可能的解決方案:-) – Endophage 2013-04-23 15:14:15

回答

2

我相信MySQL-python使用printf格式代碼(例如'%s')代替'?'佔位符。嘗試設置var_string這樣的:

var_string = ', '.join(['%s'] * 48) 

我也Endophage同意valuelist顯得太長。我不認爲你需要插入alent_guid

你也需要把周圍的GUID報價,當你插入:

query_string = 'INSERT INTO schema1 VALUES (\'%s\',%d,%s);' % (guid, x, var_string) 
+0

試過這..它給了我:TypeError:%d格式:需要一個數字,而不是str – navinpai 2013-04-23 15:36:09

+0

你試過了嗎它沒有'valuelist.insert()'行? – 2013-04-23 15:37:24

+0

是....在刪除插入行後試過了吧 – navinpai 2013-04-23 15:41:09

-1

在查詢中嘗試圍繞單引號中的值。

query_string = "INSERT INTO schema1 VALUES ('%s','%d','%s');" % (guid, x, var_string) 
+0

試過...仍然是相同的錯誤! :( – navinpai 2013-04-23 15:09:16

1

在生成48'?s後,您將2個元素插入值列表中,您是否考慮了這些元素?下面的代碼將更加強勁:

values=nprnd.randint(10, size=48) #NUMPY ARRAY 
valuelist= map(None, values); #Convert to list 
guid=''.join(random.choice(string.ascii_uppercase + string.digits) for x in range(20)) #Generate guid 
for x in range(4): 
    valuelist.insert(0,al) 
    valuelist.insert(0,ent_guid) 

    # moved this line and using len(valuelist) 
    var_string = ', '.join('?' * len(valuelist)) 

    #50 coloums in table, guid, x and 48 randomly generated values 
    query_string = 'INSERT INTO schema1 VALUES (%s,%d,%s);' % (guid, x, var_string) 
    cursor.execute(query_string, valuelist) 

更新:

從您的評論如下,這聽起來像你想加倍插入GUID和x值,因此,改變分配QUERY_STRING (與其他的變化我也做出以上)至:

query_string = 'INSERT INTO schema1 VALUES (%s);' % (var_string) 

這是比你當前字符串插值cursor.execute將確保值被適當地逃脫安全。

+0

試過,以及....它給了我同樣的錯誤,因此嘗試分配guid和x分開。在這種情況下,它會生成(guid,x,?[50]),但我們需要(guid, x,?[48])....整個表有50個顏色,一個guid(字符串),一個x(int)和48個其他顏色(再次,所有整數)。 – navinpai 2013-04-23 15:23:54

+0

@navinpai請參閱更新 – Endophage 2013-04-23 15:40:35

+0

這會導致TypeError:格式字符串沒有足夠的參數...因爲我們只傳遞var_string,但需要填寫%s,%d,%s的空格 – navinpai 2013-04-23 15:44:46

0

它看起來像你的2每次都要經過循環時間增加valuelist大小。

valuelist.insert增加通過環路的新項目到現有列表的開始,所以第一次,valuelist包含50個元素,則52在下,54的下一個等

query_string僅包含佔位符48項目,所以這會導致錯誤。

如果您刪除這些行,並更改'?'到'%s',你應該有更好的結果,例如:

for x in range(4): 
    var_string = ', '.join('%s' * 48) 
    query_string = "INSERT INTO schema1 VALUES ('%s',%d,%s);" % (guid, x, var_string) 
    cursor.execute(query_string, valuelist) 
相關問題