具有唯一约束的烧瓶SqlAlchemy批量插入

时间:2019-06-04 04:52:33

标签: python orm sqlalchemy flask-sqlalchemy

*代码不完整,但足以表达问题。

假设我们有一对多关系中的两个模型(其中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中缺少某些可能对此有所帮助的东西。

0 个答案:

没有答案
相关问题