在列中使用列表作为数据类型(SQLAlchemy)
我想把一堆RSS源的网址存到一个sqlite数据库里。我在用SQLAlchemy这个工具,但不太确定该怎么存这些网址。我找不到关于列表的相关文档,想知道这样定义一个列是否可以:
Column('rss_feed_urls', List)
或者有没有什么数组类型可以用呢?
4 个回答
12
你可以使用来自sqlalchemy的MutableList
。
from sqlalchemy.ext.mutable import MutableList
from sqlalchemy import 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)
把列表保存为字符串,然后在取出来的时候用json.loads(my_column)
。不过这种方法需要你把数据设置成键值对的格式,相比之前的方法似乎效率有点低。
20
如果你在使用PostgreSQL数据库,可以用SQL Alchemy中的一种类型叫做ARRAY。需要注意的是,这是一种有类型的数组。
class sqlalchemy.types.ARRAY(item_type, as_tuple=False, dimensions=None, zero_indexes=False)
40
如果你真的需要的话,可以使用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()
通过索引找到特定的源:
session.query(RssFeed).get(1)
我推荐你看看SQLAlchemy的对象关系教程。