使用 SQLalchemy 在数据库中存储数组

Dan*_*gal 2 python database sqlite sqlalchemy

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

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

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

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

jmk*_*aer 5

您可以通过某种方式将其序列化。一种选择是简单地调用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'>
Run Code Online (Sandbox Code Playgroud)

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

  • 两者都是字符串化对象的方法,但“str”是有效的 Python,“json.dumps”是有效的 JSON 和 Python。但是,是的,您绝对可以编写一个可以转换回来的奇特函数。我只是认为使用“json.loads”更容易。 (2认同)

Que*_*der 5

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

ORM

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

将数组添加到数据库中。

parent_one = Parent(list_of_items=['item1', 'item2'])
session.add(parent_one)
session.commit()
Run Code Online (Sandbox Code Playgroud)

现在,当您获取parent_one的记录时,您将看到它的“list_of_items”列是python中的一个数组。

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