2014-07-01 111 views
0

我想從python腳本創建一個SQL字符串。TypeError:強制爲Unicode:需要字符串或緩衝區,找不到類型

這是代碼:

sql_query = ('insert into ithelpdesk ' 
     '(id,display_id,subject,description,priority,status,requester_name,source,responder_id,due_by,updated_at,frDueBy,ticket_type,created_at)' 
     ' values (' 
     '"' + str(data['id']) + '",' 
     '"' + str(data['display_id']) + '",' 
     '"' + data['subject'] + '",' 
     '"' + data['description'] + '",' 
     '"' + str(data['priority']) + '",' 
     '"' + str(data['status']) + '",' 
     '"' + data['requester_name'] + '",' 
     '"' + str(data['source']) + '",' 
     '"' + str(data['responder_id']) + '",' 
     '"' + str(data['due_by']) + '",' 
     '"' + str(data['updated_at']) + '",' 
     '"' + str(data['frDueBy']) + '",' 
     '"' + data['ticket_type'] + '",' 
     '"' + str(data['created_at']) + '"' 
     ')') 

,當我跑我得到這個回溯消息:

Traceback (most recent call last): 
File "c:\users\swatson\dropbox\source files\winpython\dash\newTickets.py", line 198, in <module> 
main() 
File "c:\users\swatson\dropbox\source files\winpython\dash\newTickets.py", line 159, in main 
addNew(n) 
File "c:\users\swatson\dropbox\source files\winpython\dash\newTickets.py", line 65, in addNew 
'"' + str(data['created_at']) + '"' 
TypeError: coercing to Unicode: need string or buffer, NoneType found 

現在我知道的一個事實(通過執行printstr(數據[ 'created_at' ]))在data ['created_at']處有一個值,我也知道它與data ['updated_at']的值相同,所以我不知道如何解決這個問題?

回答

1

您的根本錯誤在於嘗試將查詢構建爲一個字符串。 不要那樣做。這種方式SQL注入漏洞所在。

使用SQL參數來代替:

sql_query = ('insert into ithelpdesk ' 
     '(id,display_id,subject,description,priority,status,requester_name,source,responder_id,due_by,updated_at,frDueBy,ticket_type,created_at)' 
     ' values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)', 
    (data['id'], data['display_id'], data['subject'], data['description'], 
    data['priority'], data['status'], data['requester_name'], data['source'], 
    data['responder_id'], data['due_by'], data['updated_at'], data['frDueBy'], 
    data['ticket_type'], data['created_at'])) 

確切語法取決於你的數據庫適配器;它可能是你需要使用%s。許多數據庫適配器也支持命名爲參數,在這種情況下,您甚至不需要傳遞15個單獨的值。你剛纔命名的鍵從字典中提取,查詢:

Python的DB API standard支持一些不同的參數風格。對於位置參數?%s可以使用,用於命名,:name%(name)ssqlite3使用第一種款式,MySQLDB the latter

拋出異常您將Unicode字符串數據與字符串數據連接在一起,並且在那裏有一個None。也許data['ticket_type']None

+0

謝謝你,我現在就試試。我正在使用MYSQLDB –

+0

@ Stevo_300:對於SQL參數,MySQLDB使用'%s'而不是'?'。不知道它是否支持named。 –

+0

@ Stevo_300:MySQLDB支持'%(name)s'樣式參數,所以你的代碼可以使用'%(id)s,%(display_id)s,%(subject)s'等。 –

相關問題