3

sqlite の公式ドキュメントでは、リストをバイナリ オブジェクトとして保存することを提案しています。Google は私にさまざまな提案をしてくれました。1 つは array モジュール (array.array('B', my_list2)) を使用することでしたが、これは重要なリストでは機能しませんでした:

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

TypeError: an integer is required

別の提案には pickle の使用が含まれていましたが、安全ではないと主張する人が介入しました。最後の提案は、いくつかあるリスト変数ごとに新しいテーブルを作成することです。ただし、複雑なスキーマを作成するのはためらいがあります。

私は何をすべきか?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'>
4

1 に答える 1

3

この質問は以前のSOの質問と非常に似ているように見えるので、最初はそれで問題が解決すると思いました。しかし、あなたの質問をもう一度見ると、彼らが提案する2つの方法について言及しているので、この質問を読んだようです. また、データ型が異なるため (int のリストではなくタプルのリスト)、パスを渡します。

いくつかの調査を行うと、メソッドを使用する多くのコード サンプルが見つかりますsqlite3.Binary()(ここなど)。これはあなたが望むものかもしれませんが、私が心配しているのは、 Sqlite3 Python Interface APIでこの関数のドキュメントがまったく見つからないことです。そのため、使用しないことをお勧めします。このメソッドは廃止されたと推測していますが、何がそれを置き換えたかについての明確なドキュメントが見つかりません。

とはいえ、 Sqlite3 Python Interface APIを読むと、 BLOB を Pythonバッファオブジェクトに (およびバッファ オブジェクトを 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))
于 2012-06-18T02:52:40.657 に答える