*代码不完整,但足以表达问题。
假设我们有一对多关系中的两个模型(其中Parent
可以有许多Child
):
class Child(db.Model):
__table_args__ = unique by child's name and parent id
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String)
parent = db.relationship(Parent)
class Parent(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String, unique=True)
因此,在这个世界上,父母的名字是唯一的,而孩子的名字和父母的ID是唯一的。我想编写一种方法来批量插入Child
模型,并提出了类似这样的方法:
def bulk_insert(parent_child_list):
for parent_name, child_name in parent_child_list:
parent = Parent.query.filter_by(name=parent_name).first()
if parent:
child = Child(name=child_name, parent=parent)
else:
child = Child(name=child_name, parent=Parent(name=parent_name))
但是,当您尝试批量插入具有相同Child
名称(例如Parent
)的bulk_insert([("john", "alex"), ("john", "kris")])
模型时出现问题,因为该方法将尝试插入多个Parent
模型具有相同的名称,从而打破了唯一约束。发生这种情况是因为会话提交在bulk_insert
外部。
执行此操作的一种方法是先插入所有唯一的Parent
模型并提交,然后再插入所有唯一的Child
模型。但是,有没有更简单的方法就可以在Flask SqlAlchemy中使用该自定义逻辑来实现此目的?这似乎是一个会话管理问题,因此我怀疑我必须在sqlalchemy中缺少某些可能对此有所帮助的东西。