使用SQLAlchemy可以在数据库中具有列表或数组吗?

时间:2019-04-17 08:18:28

标签: python database sqlalchemy

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

因为我希望用户能够从项目中添加或删除其他用户,而不必再次输入整个用户列表,所以我想使用字符串或数组或某种此类方法代替字符串。 / p>

但是,我一直坚持尝试输入。我最初尝试使用常规列表,但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.UnsupportedCompilationError(visitor,cls) sqlalchemy.exc.CompileError :(在表“ project”的列“ project_participants”中):编译器无法呈现

类型的元素

之前,我尝试不使用(db.Integer)或仅将其替换为Integer(因为我曾在其他遇到类似问题的人那里看到过这种情况),如下所示:

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

哪个错误提示未定义'Integer',或者如果完全忽略该错误,则显示此错误:

  

TypeError: init ()缺少1个必需的位置参数:   'item_type'

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

1 个答案:

答案 0 :(得分:1)

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