我想在sqlite db中存储rss feed url列表。我正在使用SQLAlchemy,并想知道如何存储这些。我似乎无法找到任何关于列表的文档,并且想知道这对于列是否合法: 列('rss_feed_urls',列表)
或者是否有我可以使用的数组类型?
答案 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)
。但这将要求您以键值格式设置数据,并且与以前的解决方案相比,效率似乎有些低下。