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

44 投票
4 回答
101557 浏览
提问于 2025-04-17 01:25

我想把一堆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。你也可以像这样使用SetDict,用MutableSetMutableDict

不过还有一种不太明显的方法。你可以通过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的对象关系教程

撰写回答