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

Jan*_*nie 3 python database 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))
Run Code Online (Sandbox Code Playgroud)

但这给出了错误: in _compiler_dispatch raise exc.UnsupportedCompilationError(visitor, cls) sqlalchemy.exc.CompileError: (in table 'project', column 'project_participants'): Compiler can't render element of type

之前,我尝试将 (db.Integer) 去掉或仅用 Integer 替换它(因为我在其他有类似问题的人身上看到过这种情况),如下所示:

project_participants = db.Column(db.ARRAY(Integer))
Run Code Online (Sandbox Code Playgroud)

这会给出“Integer”未定义的错误,或者,如果完全忽略它,则会出现此错误:

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

我希望将数组添加到数据库中,以便我可以使用它来追加新用户或删除用户,而不必在他只想添加或删除用户时再次使系统的用户输入全部允许用户。

Flo*_*n H 5

首先,我强烈建议您将参与者数据保存在另一个表中。您可以在 DBProject 表和参与者表之间添加 am: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)
Run Code Online (Sandbox Code Playgroud)

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

保存数据:

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

读取数据:

participants_array = db.session.query(DBProject).filter(name == "a_name").one().participants 

Result:
participants_array : ["you","him","another one"]
Run Code Online (Sandbox Code Playgroud)