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

2024-04-25 14:44:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试建立一个系统,允许用户进行“项目”。这些项目有一个相当简单的语法,它们只需要一个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))

但这会产生错误:in\u compiler\u dispatch raise不支持的编译错误(访客,cls) sqlalchemy.exc.CompileError:(在表“project”中,列“project\u participants”):编译器无法呈现类型为的元素

以前,我试着离开(整数分贝)或者用整数替换它(因为我在其他有类似问题的人身上见过这种情况):

^{pr2}$

这将导致错误“Integer”未定义,或者,如果完全忽略它,则会出现以下错误:

TypeError: init() missing 1 required positional argument: 'item_type'

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


Tags: 项目字符串用户projecttrue列表dbstring
1条回答
网友
1楼 · 发布于 2024-04-25 14:44:45

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

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

保存数据:

^{pr2}$

读取数据:

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

Result:
participants_array : ["you","him","another one"]

相关问题 更多 >

    热门问题