2016-12-05 130 views
-1

我有一個Python列表類型的數據無法插入Python列表的數據到數據庫

​​

我想插入這個名單到數據庫表 - 在一排這樣的

country = [('a', 3), ('b', 2), ('c', 1)] 

所以我已經寫代碼:

import sqlite3 
from collections import Counter 

db = "test.db" 

conn = sqlite3.connect(db) 
c = conn.cursor() 

c.execute("CREATE TABLE country_data (country TEXT)") 

country = ['a', 'a', 'a', 'b', 'b', 'c'] 

c.execute("INSERT INTO country_data VALUES(?)", (str(list(Counter(country).items())))) 

conn.commit() 

但它給我的錯誤

Traceback (most recent call last): 
File "try.py", line 19, in <module> 
c.execute("INSERT INTO country_data VALUES(?)", (str(list(Counter(country).items())))) 
sqlite3.ProgrammingError: Incorrect number of bindings supplied. The current statement uses 1, and there are 30 supplied. 

我該如何解決這個問題?

+0

嗯,我可以告訴你錯誤至少來自哪裏。由該表達式返回的字符串的長度是30.所以我猜它不期待這樣的字符串。不幸的是,我不太瞭解sqlite3庫以告訴你它需要什麼。 – user3030010

+0

如果我刪除STR()和只寫 '名單(計數器(國家).items())' 錯誤是: 'sqlite3.ProgrammingError:提供的綁定數有誤。當前語句使用1,並且提供了3個.' –

+0

您的表格由恰好一列組成。你希望如何在一列中存儲'('a',3)'?或者你的意思是你想要三行'a',兩行'b'和一行'c'? –

回答

0

首先,你需要一個能夠存儲你的號碼錶:

c.execute("CREATE TABLE country_data(country TEXT, cnt int)") 

接下來,你只需要一個元組的列表:

data = list(Counter(country).items()) 

然後,你可以插入數據加入你的執行表中:

c.executemany("INSERT INTO country_data(country, cnt) VALUES(?,?)", data) 

注意二?在INSERT中 - 每個值都有一個。


好的,我讀過您的評論了。事實證明,所有你想要的是把一個字符串放入你的文本列。 你陷入了一個小陷阱。它只是發生,你的字符串被解壓成30個字母。將它包裝成明確的元組。它可能看起來像這樣:

data = str(list(Counter(country).items())) 
c.execute("INSERT INTO country_data(country) VALUES(?)", (data,)) 
+0

感謝您的幫助。 –

0

(str(list(Counter(country).items())))不是一個元組,它只是str(list(Counter(country).items()))。您需要一個由尾隨逗號指定的元素的元組:(str(list(Counter(country).items())),)

+0

我已經嘗試過這樣但它給了我同樣的錯誤:( –

+0

@Fahim我認爲你已經混淆了你的圓括號,試試'country_string = str(list(Counter(country).items())); c.execute 「INSERT INTO country_data VALUES(?)」,(country_string,))'。 –

+0

謝謝,它現在的作品! –