【问题标题】:Using list as a data type in a column (SQLAlchemy)使用列表作为列中的数据类型(SQLAlchemy)
【发布时间】:2022-04-03 14:00:10
【问题描述】:

我想在一个 sqlite 数据库中存储一个 rss 提要 url 列表。我正在使用 SQLAlchemy 并且想知道如何存储这些。我似乎找不到任何关于列表的文档,并且想知道这对于列是否合法: 列('rss_feed_urls',列表)

或者有没有我可以使用的数组类型?

【问题讨论】:

  • 如果您使用的是 PostgreSQL,它具有数组类型,您可以将其用于此目的。 1 dim 字符串数组本质上是一个字符串列表。

标签: python sqlalchemy


【解决方案1】:

如果你真的需要,你可以使用PickleType。但是您可能想要的是另一个表(它由 list 行组成,对吗?)。只需创建一个表格来保存您的 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 的 Object Relational Tutorial

【讨论】:

    【解决方案2】:

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

    class sqlalchemy.types.ARRAY(item_type, as_tuple=False, dimensions=None, zero_indexes=False)
    

    【讨论】:

      【解决方案3】:

      您可以使用 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, DictMutableSet, MutableDict

      还有另一种不太明显的方法。要通过json.dumps(my_list) 保存为字符串,然后在检索时执行json.loads(my_column)。但它需要你将数据设置为键值格式,与之前的解决方案相比似乎效率有点低。

      【讨论】:

        【解决方案4】:

        SQL 数据库列数据类型之间通常没有列表。

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

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

        【讨论】:

        猜你喜欢
        • 2021-07-16
        • 2020-12-07
        • 1970-01-01
        • 2015-09-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-07
        相关资源
        最近更新 更多