SQLAlchemy会话包含没有session.add()

时间:2015-06-26 20:03:26

标签: python session flask sqlalchemy

我只是感到困惑。我忘了添加

  

db.session.add(newbranch)

到下面的代码,只是为了找出它,不知何故它已经在会话中,就像我运行commit()时一样。

我的研究表明需要添加新项目。好吧,正如你在下面的代码中看到的那样,我正在创建新项目但不添加它们,但它们会被添加。

任何人都可以帮我理解为什么吗?

从我看来:

newbranch = Branch(
    name = newbranch_form.name.data,
    account = account)

newbranch_form.populate_assoc(newbranch)

db.session.commit()

我的表单中的帮助函数:

def populate_assoc(self, branch_obj):
    branch_obj.name = self.name.data

    for assoc_obj in branch_obj.equipment_assoc:
        db.session.delete(assoc_obj)

    for eq, mod in zip(self.equipment, self.mod):
        new_assoc = A_branch_eq(
            equipment_id = eq.data,
            branch = branch_obj,
            mod = mod.data)

1 个答案:

答案 0 :(得分:5)

branch_obj已在会话中。通过分配关系属性(A_branh_eq)将其与branch=branch_obj实例关联时,它们会添加到brand_obj已经属于的同一会话中。当实例中没有任何部分或其关系已经在会话中时,您只需要显式使用db.session.add

控制此设置的设置为relationship.cascade。默认设置包括save-update选项。

  

save-update级联表示当一个对象通过Session放入Session.add()时,通过此relationship()与之关联的所有对象也应添加到该Session split