Chr*_*ris 16 python sqlalchemy
我想在sqlite db中存储rss feed url列表.我正在使用SQLAlchemy,并想知道如何存储这些.我似乎无法找到任何关于列表的文档,并想知道这对于列是否合法:Column('rss_feed_urls',List)
或者是否有我可以使用的数组类型?
zee*_*kay 23
如果你真的必须使用PickleType.但你可能想要的是另一个表(由行列表组成,对吧?).只需创建一个表来保存您的RSS源:
class RssFeed(Base):
__tablename__ = 'rssfeeds'
id = Column(Integer, primary_key=True)
url = Column(String)
Run Code Online (Sandbox Code Playgroud)
添加新网址:
feed = RssFeed(url='http://url/for/feed')
session.add(feed)
Run Code Online (Sandbox Code Playgroud)
检索您的网址列表:
session.query(RssFeed).all()
Run Code Online (Sandbox Code Playgroud)
按索引查找特定Feed:
session.query(RssFeed).get(1)
Run Code Online (Sandbox Code Playgroud)
我推荐SQLAlchemy的对象关系教程.
如果您使用的是 PostgreSQL 数据库,则可以为此使用 SQL Alchemy 类型ARRAY。请注意,它是一个类型化的数组。
class sqlalchemy.types.ARRAY(item_type, as_tuple=False, dimensions=None, zero_indexes=False)
Run Code Online (Sandbox Code Playgroud)
您可以MutableList从 sqlalchemy使用
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))
Run Code Online (Sandbox Code Playgroud)
如果您只是使用PickleType,您将无法在第一次插入后修改该列表。要稍后修改,我们需要MutableList. 您也可以Set, Dict像这样使用MutableSet, MutableDict.
不过,还有另一种不太明显的方法。要保存为字符串json.dumps(my_list),然后在检索时只需执行json.loads(my_column). 但是它需要您以键值格式设置数据,并且与之前的解决方案相比似乎效率低下。