2012-12-17 61 views
1

我使用Python,我得到一個「不正確的整數值:'(2L,)」列'id'在第1行「Python不正確的整數值:'(2L,)'在第1行的列'id'

完蛋了我做什麼:

for user in users: 
      userID = self.selectQuery("SELECT COUNT(id) FROM user;") 
      self.changeQuery("INSERT INTO user VALUES ('" + str(userID[0]) + "', '" + str(user) + "','','');") 

def changeQuery (self, query): 

    connection = MySQLdb.connect(self.mysql_host, self.mysql_user, self.mysql_password, self.mysql_db) 
    cursor = connection.cursor() 
    cursor.execute (query) 
    connection.commit() 
    cursor.close() 
    connection.close() 
+0

來吧。這真的是你認爲我們需要的所有信息嗎? – Marcin

+0

我編輯了線程! :)更好? – Furtano

+0

你不認爲用完整的錯誤輸出來回答會更容易嗎? – Marcin

回答

3

不要使用str()和字符串連接時,可以使用SQL參數來代替;此外,您的userID變量包含元組列表,而不是整數列表;你的函數必須以行的形式返回所有的結果。以下將工作,如果你有一個數據庫遊標參考:

cursor.execute("INSERT INTO user VALUES (%s, %s,'','');", (userID[0][0], user)) 

使用SQL參數有一個好處,數據庫適配器將應用正確的引用到任何值要傳遞的字符串將被引用,整數不是。例如,最重要的是,危險的SQL注入嘗試受挫。

指定SQL參數的確切語法取決於您的數據庫適配器。我用%s風格位置參數(如您使用的標籤),但根據數據庫適配器,以下任一可支持:

  • ?位置參數
  • %s位置參數(用我的MySQLdb的,例如)
  • :name命名參數
  • %(name)s命名參數

請檢查您的數據庫適配器文檔以瞭解支持的確切變體。

你的情況發生了什麼事是userID[0]是包含一個Python長整型,其字符串表示包括L一個元組。即使數據庫沒有,你的數據庫也不會接受你的查詢,因爲你假定所有的輸入值都是字符串,而且無論如何你都在引用值。查詢期望整數的字符串"0"將不起作用。

外推給你的擴展功能:

def changeQuery(self, query, parameters=()):  
    connection = MySQLdb.connect(self.mysql_host, self.mysql_user, self.mysql_password, self.mysql_db) 
    cursor = connection.cursor() 
    cursor.execute(query, parameters) 
    connection.commit() 
    cursor.close() 
    connection.close() 

,並呼籲有:

self.changeQuery("INSERT INTO user VALUES (%s, %s,'','');", (userID[0][0], user)) 
+0

現在我得到TypeError:並非所有在字符串格式化過程中轉換的參數 – Furtano

+0

@Furtano:進一步更新;你的'userID'變量很可能是一個元組列表。 –

相關問題