在我的应用程序中,一个“集合”可以有许多与之关联的“产品”。针对一组列出的产品必须定义数量。对于这种多对多关系,我遵循了SQLAlchemy 文档以使用带有附加列(数量)的关联表。
我正在尝试创建一个表单,用户可以在其中根据给定的集合分配产品和数量。数据库中已存在套装和产品。表格中的数据是:
这可以创建一个新的关联(例如,第 1 组“链接”到数量 = XYZ 的产品 3),但是当我尝试更新现有记录时出现完整性错误。
我可以手动添加关系/记录(虚拟数据)或在 Flask 视图函数中,如下所示:
s = Set.query.get(2)
p = Product.query.get(3)
a = Set_Product_Association(set=s, product=p, quantity=23)
db.session.add(a)
db.session.commit()
Run Code Online (Sandbox Code Playgroud)
手动更新记录(不同数量)如下工作:
s.products[0].quantity = 43
db.session.add(s)
db.session.commit()
Run Code Online (Sandbox Code Playgroud)
但是,当我使用第一个块中的代码时(目的是更新quantity给定的现有集合和产品 ID的字段),即:
a = Set_Product_Association(set=s, product=p, quantity=43)
Run Code Online (Sandbox Code Playgroud)
我收到完整性错误
sqlalchemy.exc.IntegrityError: (sqlite3.IntegrityError) UNIQUE constraint failed: set_product_association.set_id, set_product_association.product_id [SQL: 'INSERT INTO set_product_association (set_id, product_id, quantity) VALUES (?, ?, ?)'] [parameters: (2, 3, 43)]
Run Code Online (Sandbox Code Playgroud)
我认为这是告诉我我正在尝试添加新记录而不是更新现有记录。
我应该如何处理这个问题?“手动”方法有效,但依赖于在列表中计算出正确的索引(即正确的 product.id)。
奇怪的是,如果我用form.popluate_obj(set)我的观点瓶函数来处理表单数据,在我的问题描述在这里 …