2009-10-05 103 views

回答

9

您必須通過您喜歡的方式將列表(或其他Python對象)序列化爲一串字節,即「BLOB」;-)(marshal適用於基本值列表,如數字或字符串& c, cPickle如果你想要一個非常通用的解決方案,等等),並且當你取回它時將它反序列化。當然,這基本上攜帶列表(或其他Python對象)作爲一個被動的「有效載荷」 - 不能有意義用它WHERE條款,ORDER BY

關係數據庫只是不處理那麼好與非原子值,並希望其他,規範化的替代品(將列表項存儲在不同的表中,其中包括「listID」列,把「listID」放在你的主表中,等等)。非關係數據庫雖然通常對關係數據庫有限制(例如,沒有連接),但可以爲您的需求提供更直接的支持。

一些關係數據庫確實具有非關係擴展。例如,PostGreSQL支持一個array數據類型(不像Python的列表一樣普遍--PgSQL的數組在本質上是同類的)。

+0

謝謝。我想我會重新設計我的數據庫以創建一個單獨的表,因爲我需要能夠使用'WHERE'子句中的值。 – john2x 2009-10-05 09:16:30

8

通常,通過對列表(使用repr())進行字符串化來完成此操作,然後保存該字符串。在從數據庫讀取字符串時,使用eval()重新創建列表。請注意,儘管您肯定沒有用戶生成的數據可以進入該列,或者eval()存在安全風險。

3

你的問題很難理解。這裏又是:

我想要3列有9個不同的值,就像Python中的列表。可能嗎?如果不是在SQLite中,那麼在另一個數據庫引擎上?

下面是我相信你問的是:是否有可能採取9個不同值的Python列表,並將值保存在數據庫中的特定列下?

這個問題的答案是「是」。我建議使用Python ORM庫而不是自己編寫SQL代碼。此示例代碼使用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 

這個例子從一個列表拉值,並使用值從數據庫中填充一列。它可以平凡地擴展到添加額外的列並填充它們。

如果這不是您正在尋找的答案,請更改您的請求來澄清。

P.S.本例使用autumn.util。當前版本的「秋天」包含的setup.py未在正確的位置安裝util.py;你需要手工完成秋季的設置。

您可以使用更成熟的ORM,如SQLAlchemy或Django的ORM。不過,我真的很喜歡Autumn,尤其是對於SQLite。

相關問題