2012-06-18 90 views
3

sqlite的官方文檔建議將列表存儲爲二進制對象。 Google讓我提出了各種建議。一個是使用陣列模塊(array.array(「B」,my_list2),但是這並沒有爲一個不平凡的工作清單:Python/SQLite存儲列表作爲二進制文件(blob)

my_list2 = [(23,"Bob"), (22,"Alice")] 
array.array('B',my_list2) 

TypeError: an integer is required 

另一個建議涉及使用泡菜,但有人插話聲稱它我不知道如何創建一個新的表格,其中有幾個我很猶豫要製作一個複雜的模式

我該怎麼做?我應該如何存儲my_list2,以及其他列表,在數據庫中?

編輯

發現一個優雅,整潔的解決方案,用最少的代碼簡單和複雜的情況下工作:我認爲這可能會解決你的問題

import json 
my_list2 = [(23,"Bob Baker"), (22,"Alice Adams")] 
my_list2_str = json.dumps(my_list2) 
print type(my_list2_str) 
<type 'str'> 
list2 = json.loads(my_list2_str) 
print list2, type(list2) 
[(23, u"Bob Baker"), (22, u"Alice Adams")] <type 'list'> 

回答

3

這個問題似乎很相似,所以this earlier SO question在第一位。但再看看你的問題,似乎你自從提到他們提出的兩種方法之後就讀過這個問題。另外,由於你的數據類型是不同的(元組列表而不是整數列表),我會給你一個通行證。

做一些研究我發現很多使用方法sqlite3.Binary()(如here)的代碼示例。這可能是你想要的,但是我擔心的是我可以找到絕對沒有文檔Sqlite3 Python Interface API這個功能。因此,我建議不要使用它。我猜這種方法已被棄用,但我找不到有關替換它的明確文檔。也就是說,如果你閱讀Sqlite3 Python Interface API,你會發現它會自動將BLOBs轉換爲python buffer對象(並將緩衝區對象轉換爲BLOB)。所以在我看來,如果你可以將你的列表轉換爲緩衝區,那麼你可以將它作爲BLOB存儲。

在我的研究中,我發現列表不能存儲爲緩衝區。我還發現雖然有方法將列表轉換爲緩衝區,但它們需要簡單類型的列表(即不是元組)。因此,我認爲最好的辦法是定義一些用於將列表轉換爲字符串和從字符串轉換爲字符串的實用程序方法,然後將字符串轉換爲緩衝區(並在您從數據庫中檢索它們時返回)。

def myListToStr(myList): 
    """This method takes a list of (int, str) tuples and converts them to a string""" 

    strList = "" 
    for item in myList: 
     num, name = item #split the tuple 

     strList += "{}:{} ".format(num, name) #append the tuple in "num:name" format with a " " delimiter 

    return strList[:-1] #remove the final space (unneeded) 

def strToMyList(myStr): 
    """This method takes a string in the format "int:str int:str int:str..." 
    and converts it to a list of (int, str) tuples""" 

    myList = [] 
    for tup in myStr.split(" "): #for each converted tuple 
     numStr, name = tup.split(":") #split the tuple 

     num = int(numStr) #NOTE: this will throw an error if numStr.isdigit() is False 
     myList.append(num, name) 

    return myList 

現在,轉換爲緩衝區是那麼容易,因爲

my_list2Buff = buffer(myListToStr(my_list2)) 

而且回來...

my_list2 = strToList(str(my_list2Buff)) 
相關問題