2012-07-18 87 views
1

我有一個字符串列表/數組:插入一個數組sqlite3的蟒蛇

l = ['jack','jill','bob'] 

現在我需要用我可以插入該數組到一個名爲「名稱」列slite3創建一個表蟒蛇。我不希望每行中的每個名稱都有多行。我想要一個包含完全如上所示的數組的單行,我希望能夠以完全相同的格式檢索它。我怎樣才能在數據庫中插入一個數組作爲元素?在創建數據庫本身時,我應該聲明什麼作爲數組的數據類型?如:

c.execute("CREATE TABLE names(id text, names ??)") 

我該如何插入值?喜歡:

c.execute("INSERT INTO names VALUES(?,?)",(id,l)) 

編輯:我是如此愚蠢。我只是意識到,我可以有多個條目的id和使用查詢來提取所有相關的名稱。不管怎麼說,還是要謝謝你!

+2

你的用例是什麼?插入的文本是否可以選擇?對於大多數用例,你試圖做的是一個壞主意。 – 2012-07-18 13:51:15

+0

是的,我需要能夠選擇列表後,我把它放在數據庫中.. – Amitash 2012-07-18 13:55:06

+1

然後你在做什麼牢牢落在糟糕的想法類別下,你應該使用一個單獨的表名稱,並使用許多多元關係模式。 – 2012-07-18 13:57:39

回答

5

您可以存儲陣列在一個字符串字段,如果你不知何故genereate它的字符串表示,例如唱歌pickle模塊。然後,當你閱讀這一行時,你可以取消它。 Pickle將許多不同的複雜對象(但不是全部)轉換成一個字符串,該對象可以被恢復。但是:這很可能不是你想做的事情(你不能用tabel中的數據做任何事情,除了選擇行然後取消數組。想要具有不同長度的任何東西(或固定長度,但是有許多類似事物的實例),則不希望將其放在一列或多列中,垂直而不是水平地存在,這意味着:不要關於列,考慮行數爲了存儲具有任意數量的組件的矢量,表格是一個很好的工具

從你給的小細節來解釋有點困難,但你應該考慮創建第二個表,第一張桌子的每一行都有名字,你需要在第一張桌子上放一些鑰匙表中,您可以使用您的第二個表,太:

c.execute("CREATE TABLE first_table(int id, varchar(255) text, additional fields)") 
c.execute("CREATE TABLE names_table(int id, int num, varchar(255) name)") 

有了這個,你仍然可以儲存你除了在first_table名稱的任何信息和名稱的數組存儲在names_table,只要使用相同的id爲在first_tablenum中存儲數組內的索引位置。然後,您可以稍後做成纔像

SELECT name FROM names_table 
WHERE id=? 
ORDER BY num 

first_table讀名稱數組您的任何行取回陣列。

這是將數組存儲在數據庫中的一種非常正常的方式。

1

這不是要走的路。您應該考慮爲外部名稱的名稱創建另一個表。

1

你可以把你的數組pickle/marshal/json並作爲binary/varchar/jsonfield存儲到你的數據庫中。

喜歡的東西:

import json 

names = ['jack','jill','bill'] 
snames = json.dumps(names) 
c.execute("INSERT INTO nametable " + snames + ";")