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

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的对象关系教程.


thr*_*you 9

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

class sqlalchemy.types.ARRAY(item_type, as_tuple=False, dimensions=None, zero_indexes=False)
Run Code Online (Sandbox Code Playgroud)


Ami*_*ial 7

您可以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). 但是它需要您以键值格式设置数据,并且与之前的解决方案相比似乎效率低下。


Max*_*kin 5

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

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

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

  • 天哪,我知道这并不容易。varchar 类型到底是什么?SQLAlchemy 文档没有详细说明。 (2认同)