2017-09-14 125 views
0

我試圖變量的內容添加到一個SQLite數據庫的數據,但我得到的的Python SQLite的插入來自變量

sqlite3.InterfaceError: Error binding parameter 0 - probably unsupported type. 

我的代碼中的錯誤是: -

import requests 
import json 
import eventlet 
import os 
import sqlite3 

#Get the currect vuln_sets 
response = requests.get('https://vulners.com/api/v3/search/stats/') 
vuln_set = json.loads(response.text) 
vuln_type = vuln_set['data']['type_results'] 
for k in vuln_type: 
    vuln_bulletinfamily = vuln_set['data']['type_results'][k]['bulletinFamily'] 
    vuln_name = vuln_set['data']['type_results'][k]['displayName'] 
    vuln_count = vuln_set['data']['type_results'][k]['count'] 



con = sqlite3.connect('vuln_sets.db') 
with con: 
    cur = con.cursor() 
    con.row_factory = sqlite3.Row 


    cur.execute("REPLACE INTO vuln_sets (vulntype, displayname, bulletinfamily, count) values (?, ?, ?, ?)", (vuln_type, vuln_bulletinfamily, vuln_name, vuln_count)) 
    con.commit() 

變量包含JSON密鑰對,因爲我需要將其中的一些插入到數據庫中進行處理,但是需要一個不同的項目。

堆棧跟蹤是:

Traceback (most recent call last): 
    File "test.py", line 24, in <module> 
    cur.execute("REPLACE INTO vuln_sets (vulntype, displayname, bulletinfamily, count) values (?, ?, ?, ?);", (vuln_type, vuln_bulletinfamily, vuln_name, vuln_count)) 
sqlite3.InterfaceError: Error binding parameter 0 - probably unsupported type. 
+0

你能給出一個完整的堆棧跟蹤嗎? – zython

+2

'vuln_type'是一個列表。我可以看到這一點,因爲您在代碼中先前遍歷了它。你不能插入一個列表。我想你想讓所有的代碼縮進到'for vuln_type:'循環中並在你的查詢中用'k'代替'vuln_type'。 – roganjosh

+0

添加上面的 – Luke

回答

0

@ roganjosh的評論定了!我需要在for循環中包含DB事務處理,如下所示:

import requests 
import json 
import eventlet 
import os 
import sqlite3 

#Get the currect vuln_sets 
response = requests.get('https://vulners.com/api/v3/search/stats/') 
vuln_set = json.loads(response.text) 
vuln_type = vuln_set['data']['type_results'] 
for k in vuln_type: 
    vuln_bulletinfamily = vuln_set['data']['type_results'][k]['bulletinFamily'] 
    vuln_name = vuln_set['data']['type_results'][k]['displayName'] 
    vuln_count = vuln_set['data']['type_results'][k]['count'] 
    con = sqlite3.connect('vuln_sets.db') 
    with con: 
     cur = con.cursor() 
     con.row_factory = sqlite3.Row  
     cur.execute("REPLACE INTO vuln_sets (vulntype, displayname, bulletinfamily, count) values (?, ?, ?, ?)", (k, vuln_name, vuln_bulletinfamily, vuln_count)) 
     con.commit()