是否可以将值列表保存到SQLite列中?

时间:2009-10-05 00:26:27

标签: python sqlite

我希望3列有9个不同的值,比如Python中的列表。 可能吗?如果不在SQLite中,那么在另一个数据库引擎上?

3 个答案:

答案 0 :(得分:13)

您必须通过您最喜欢的方式将列表(或其他Python对象)序列化为一串字节,即“BLOB”;-),marshal适用于基本值列表,如数字或字符串& c,cPickle如果你想要一个非常通用的解决方案,等等,并在你取回它时反序列化它。当然,这基本上将列表(或其他Python对象)作为被动“有效负载” - 不能在WHERE子句,ORDER BY等中有意义地使用它。

关系数据库只是不能很好地处理非原子值,并且更喜欢其他标准化备选方案(将列表的项目存储在包含“listID”列的不同表中,将“listID”放在主列表中表等)。非关系型数据库,虽然它们通常具有相关性的限制(例如,没有连接),但可以为您的需求提供更直接的支持。

某些关系数据库确实有非关系扩展。例如,PostGreSQL支持array数据类型(不像Python的列表那么通用--PgSQL的数组本质上是同类的)。

答案 1 :(得分:10)

通常,您可以通过对列表进行字符串化(使用repr()),然后保存字符串来完成此操作。在从数据库中读取字符串时,使用eval()重新创建列表。请注意,尽管您确定没有用户生成的数据可以进入该列,或者eval()存在安全风险。

答案 2 :(得分: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。当前版本的Autumn中包含的setup.py不会将util.py安装在正确的位置;你需要手工完成秋天的设置。

您可以使用更成熟的ORM,例如SQLAlchemy或来自Django的ORM。但是,我真的喜欢秋天,特别是对于SQLite。

相关问题