我正在尝试构建一个允许用户创建“项目”的系统。这些项目的语法相当简单,只需要一个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'
我希望将数组添加到数据库中,这样我就可以使用它来添加新用户或删除用户,而不必让系统用户重新输入所有允许的用户(当他只想添加或删除一个用户时)
答案 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"]