是否可以使用 SQLAlchemy 在数据库中拥有列表或数组?



我正在尝试构建一个允许用户制作"项目"的系统。这些项目的语法相当简单,它们只需要一个ID,一个名称,一个可选的描述和参与者。

因为我希望用户能够在项目中添加或删除其他用户,而不必再次输入整个用户列表,所以我想使用字符串或数组或一些这样的方法来代替字符串。

但是,我坚持尝试输入它。我最初尝试了一个常规列表,但SQLalchemy不接受。谷歌搜索后,似乎这是不可能的?除非我只是没有遇到它。

我现在尝试改用数组。我当前的代码如下所示:

class DBProject(db.Model):
__tablename__ = 'project'
project_id = db.Column(db.Integer, primary_key=True)
project_name = db.Column(db.String(128))
project_description = db.Column(db.String(255), nullable=True)
project_participants = db.Column(db.ARRAY(db.Integer))

但这给出了错误:在_compiler_dispatch提高 exc。不支持编译错误(访问者,cls) sqlalchemy.exc.CompileError:(在表"项目"中,"project_participants"列):编译器无法呈现类型的元素

之前,我尝试离开(db。整数)输出或仅用整数替换它(因为我在其他有类似问题的人身上看到过这种情况),如下所示:

project_participants = db.Column(db.ARRAY(Integer))

这给出了未定义"整数"的错误,或者在完全省略的情况下,此错误:

类型错误:init() 缺少 1 个必需的位置参数: "item_type">

我希望将数组添加到数据库中,以便我可以使用它来附加新用户或删除用户,而不必在系统的用户输入所有允许的用户时重新输入他只想添加或删除一个用户。

首先,我强烈建议您将参与者数据保存在其他表格中。 您可以在 DBProject-Table 和 Members-Table 之间添加 m:n 关系。 其他任何事情都反对数据库的任何最佳实践使用。 将参与者另存为表中的数组使得在 SQL 查询中按参与者进行筛选变得不可能或至少非常不舒服。

但是,如果您有充分的理由忽略该建议,则可以使用 pickle 使 SQLAlchemy 在写入数据库时将数组转换为字符串。

class DBProject(db.Model):
__tablename__ = 'project'
project_id = db.Column(db.Integer, primary_key=True)
project_name = db.Column(db.String(128))
project_description = db.Column(db.String(255), nullable=True)
project_participants = db.Column(db.PickleType, nullable=True)

使用该结构,您基本上可以将任何对象(如果不超过数据库特定的最大大小)放入数据库字段中。

保存数据:

dbproject_object = DBProject()
dbproject_object.name = "a_name"
dbproject_object.participants = ["you","him","another one"]
session.add(dbproject_object)
session.commit()

读取数据:

participants_array = db.session.query(DBProject).filter(name == "a_name").one().participants 
Result:
participants_array : ["you","him","another one"]

最新更新