【问题标题】:Storing arrays in database using SQLalchemy使用 SQLalchemy 在数据库中存储数组
【发布时间】:2020-08-05 18:26:50
【问题描述】:

我目前正在构建一个项目,在该项目中,我需要为每个用户保存一个字符串列表(他阅读的文章的网址)。

我正在使用 python + flask + SQLalchemy 和 sqlite。

我知道 sqlite 不支持数组,所以我正在考虑切换到不同的数据库而不是支持数组的 sqlite。

我想知道你会做什么?哪个数据库支持数组或者是否有更好的方法来解决它。

【问题讨论】:

标签: python database sqlite sqlalchemy


【解决方案1】:

您可以通过某种方式对其进行序列化。一种选择是简单地使用数组调用str,然后在需要将其转换回来时以某种方式处理它。

另一种选择是使用json 模块:

import json


lst = [1,2,3]

serialized = json.dumps(lst)
print(serialized)                           # '[1, 2, 3]'
print(type(serialized))                     # <class 'str'>

deserialized = json.loads(serialized)
print(deserialized)                         # [1, 2, 3]
print(type(deserialized))                   # <class 'list'>

但正如 ggorlen 的链接所暗示的,您应该尝试提出比直接存储数组更好的选择。

【讨论】:

  • 在两个链接上我都看到了序列化选项,我需要学习,因为我不熟悉。它有什么缺点吗?
  • @DanielSegal 你熟悉database normalization吗?原子性是1NF 的要求。但序列化只是简单地将数据转换为可以存储的格式(例如字符串)。
  • 不,我不熟悉它。我的问题是这种方法与做 str(list) 有什么不同,当我想回到列表时,只需编写一个花哨的函数就可以了?
  • 两者都是字符串化对象的方法,但str 是有效的 Python,json.dumps 是有效的 JSON 和 Python。但是,是的,您绝对可以编写一个花哨的函数来转换回来。我只是觉得改用json.loads 更容易。
  • SQLite 也支持 JSON,SQLAlchemy 支持 SQLite JSON 实现:docs.sqlalchemy.org/en/13/dialects/…
【解决方案2】:

MySQL 和 SQLlite 都支持 JSON 列。您可以将数组存储在 JSON 列中。就最佳实践和性能而言,将数组放入数据库当然是值得商榷的。

ORM

class Parent(Base):
    __tablename__ = 'parent'
    id = Column(Integer, primary_key=True)
    list_of_items = Column(JSON, nullabled=False)

将数组添加到您的数据库。

parent_one = Parent(list_of_items=['item1', 'item2'])
session.add(parent_one)
session.commit()

现在当你获取 parent_one 的记录时,你会看到它的 'list_of_items' 列在 python 中是一个数组。

这也可以使用 SQL alchemy 核心语言来完成。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-13
    • 2019-09-15
    • 2015-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多