2009-10-05 4 views

答えて

9

好きな手段(marshalは数字や文字列などの基本的な値のリストに適しています)を使ってリスト(または他のPythonオブジェクト)をバイト列、別名「BLOB」;-)にシリアル化する必要があります。& c、非常に一般的な解決策などが必要な場合はcPickle)、逆フェッチしたときに逆シリアル化します。もちろん、これは基本的にリスト(または他のPythonオブジェクト)を受動的な "ペイロード"として運びます。WHERE節、ORDER BYなどで有意義に使うことはできません。

リレーショナルデータベースでは、他の正規化された選択肢(「listID」列を含む別の表にリストの項目を格納し、メイン表に「listID」を入れるなど)を優先します。非リレーショナルデータベースは、通常、リレーショナルデータベースには制限がありますが(たとえば、結合がない)、要件に対するより直接的なサポートが提供される可能性があります。

一部のリレーショナルデータベースには、非リレーショナル拡張があります。たとえば、PostGreSQLはarrayのデータ型をサポートしています(Pythonのリストと同じくらい一般的ではありません.PgSQLの配列は本質的に同質です)。

+0

ありがとうございました。私は 'WHERE'節で値を使う必要があるので、別のテーブルを持つようにデータベースを再設計すると思います。 – john2x

8

一般的には、リストを文字列化して(repr()を使用して)、文字列を保存します。データベースから文字列を読み込むときは、eval()を使ってリストを再作成します。ただし、ユーザが生成したデータがカラムに入ることがないか、eval()がセキュリティ上のリスクであることは確かですが、注意してください。

3

あなたの質問はわかりにくいです。ここにもう一度あります:

3列にはPythonのリストのように9つの異なる値が必要です。出来ますか? SQLiteにない場合は、別のデータベースエンジンでですか?

私はあなたが尋ねていると思います:9つの異なる値のPythonリストを取り、値をデータベースの特定の列の下に保存することは可能ですか?

この質問に対する回答は「はい」です。自分でSQLコードを書くのではなく、Python ORMライブラリを使うことをお勧めします。この例のコードはAutumn使用しています:

import autumn 
import autumn.util 
from autumn.util import create_table 

# get a database connection object 
my_test_db = autumn.util.AutoConn("my_test.db") 


# code to create the database table 
_create_sql = """\ 
DROP TABLE IF EXISTS mytest; 
CREATE TABLE mytest (
    id INTEGER PRIMARY KEY AUTOINCREMENT, 
    value INTEGER NOT NULL, 
    UNIQUE(value) 
);""" 

# create the table, dropping any previous table of same name 
create_table(my_test_db, _create_sql) 

# create ORM class; Autumn introspects the database to find out columns 
class MyTest(autumn.model.Model): 
    db = my_test_db 


lst = [3, 6, 9, 2, 4, 8, 1, 5, 7] # list of 9 unique values 

for n in lst: 
    row = MyTest(value=n) # create MyTest() row instance with value initialized 
    row.save() # write the data to the database 

実行このコードは、その後のPythonを終了し、sqlite3 my_test.dbを実行します。そして、SQLiteの内部で、このSQLコマンドを実行します。ここでselect * from mytest;は結果である:

1|3 
2|6 
3|9 
4|2 
5|4 
6|8 
7|1 
8|5 
9|7 

この例では、1つのリストから値を取り出して、データベースから1列を移入するための値を使用しています。追加の列を追加して列に追加することも可能です。

これがあなたが探している回答でない場合は、明確にするためにあなたの要求を言い換えてください。

P.S.この例ではautumn.utilを使用しています。現在の秋のリリースに含まれているsetup.pyは、正しい場所にutil.pyをインストールしません。あなたは手で秋の設定を完了する必要があります。

SQLAlchemyやDjangoのORMなど、より成熟したORMを使用できます。しかし、私は本当に秋、特にSQLiteを好きです。

関連する問題