使用列表作为列中的数据类型(SQLAlchemy)

时间:2011-09-04 15:28:42

标签: python sqlalchemy

我想在sqlite db中存储rss feed url列表。我正在使用SQLAlchemy,并想知道如何存储这些。我似乎无法找到任何关于列表的文档,并且想知道这对于列是否合法:     列('rss_feed_urls',列表)

或者是否有我可以使用的数组类型?

4 个答案:

答案 0 :(得分:22)

如果你真的必须使用PickleType。但你可能想要的是另一个表(由行的列表组成,对吧?)。只需创建一个表来保存您的RSS源:

class RssFeed(Base):
    __tablename__ = 'rssfeeds'
    id = Column(Integer, primary_key=True)
    url = Column(String)

添加新网址:

feed = RssFeed(url='http://url/for/feed')
session.add(feed)

检索您的网址列表:

session.query(RssFeed).all()

按索引查找特定Feed:

session.query(RssFeed).get(1)

我推荐SQLAlchemy的Object Relational Tutorial

答案 1 :(得分:5)

SQL数据库列数据类型中通常没有列表。

将列表存储为列值的一种方法是将该列表转换为字符串,该字符串将映射到数据库数据类型varchar

另一种方法是将列表转换为序列化二进制表示(例如,使用pickle库)并将值存储为类型blob的数据库值。

答案 2 :(得分:2)

如果使用的是PostgreSQL数据库,则可以为此使用SQL Alchemy类型ARRAY。请注意,它是一个类型化的数组。

class sqlalchemy.types.ARRAY(item_type, as_tuple=False, dimensions=None, zero_indexes=False)¶

答案 3 :(得分:2)

您可以在sqlalchemy中使用MutableList

from sqlalchemy.ext.mutable import MutableList
from sqlalchemy impoer pickleType
import logging # not necessary, for logging purpose only

my_list_column_field = Column(MutableList.as_mutable(PickleType),
                                    default=[])

# now you can do common operations in this list. e.g:

# append to the list (just like python)
my_list_column_field = my_list_column_field + [any_data_type]

# and don't forget to commit your changes
try:
   db.commit()
except SQLAlchemyError as e:
   db.rollback()
   logging.error("Failed to Commit because of {error}. Doing Rollback".format(error=e))

如果仅使用PickleType,则在第一次插入后将无法修改该列表。要稍后进行修改,我们需要MutableList。您也可以使用Set, Dict这样使用MutableSet, MutableDict

不过,还有另一种不太明显的方法。要通过json.dumps(my_list)另存为String,然后在检索时只需执行json.loads(my_column)。但这将要求您以键值格式设置数据,并且与以前的解决方案相比,效率似乎有些低下。