SQL炼金术会话.合并不起作用了

2021-02-26 15:05:44 发布

您现在位置:Python中文网/ 问答频道 /正文

AFAIK merge执行和insert or update所以我所做的非常简单。 集线器和标签之间有1到N的关系。 因此,当我尝试在tag和hub上进行合并时,hub运行得很好,从DB加载现有的hub并进行更新,但当执行db.session.merge(nuevo_tag)时失败,并引发异常,因为幕后试图进行插入,即使标记先前存在。 我做错了什么?在

nuevo_hub = Hub(guid_hub,name,location,comments,id_project,creado_en,actualizado_en)
merged_hub = db.session.merge(nuevo_hub)
#db.session.commit() # If I use this line tags perform an insert.
nuevo_tag = Tag(guid_tag,project,merged_hub,TYPE_HUB,creado_en,actualizado_en)
merged_tag = db.session.merge(nuevo_tag)
db.session.commit()

如果我删除db.session.commit(),则显示其他错误:

sqlalchemy.orm.exc.FlushError: New instance with identity key (, (b'\x11\x0e\x84\x00\xe2\x9b\x11\xd4\xa7\x16DfUD\x00\r',)) conflicts with persistent instance

^{pr2}$
1条回答
网友
1楼 ·

我在docs找到了答案。 考虑Hub是Item的一个子类。 我必须将backref lazy从joined改为dynamic。在

class Tag(db.Model):
    __tablename__ = "tags"
    guid_tag      = db.Column(db.BINARY(16), primary_key=True)
    id_project  = db.Column(db.Integer,db.ForeignKey("projects.id_project"))
    guid_item     = db.Column(db.BINARY(16),db.ForeignKey("items.guid_item"))
    project     = db.relationship(Proyecto, backref=db.backref('list_tags', lazy='dynamic'))
    item        = db.relationship(Item, backref=db.backref('list_tags', lazy='joined'))
    type        = db.Column(db.Integer) #(0,hub);(1,cable);(2,pipe);(3,electrical_pipes)
    created_at  = db.Column(db.DateTime)
    updated_at  = db.Column(db.DateTime)

换句话说,我必须避免在同一个会话中有一个持久性对象的两个副本。在

相关问题