afaik merge performs , insert or update
i'm doing pretty simple. there relation of 1 n between hubs , tags. when try make merge on tag , hub, hub goes , load db existent hub , make update, fails when db.session.merge(nuevo_tag)
executed throwing exception because behind scenes tries make insert, if tag exist. did wrong?
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 use line tags perform 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()
if remove db.session.commit()
other error shown:
sqlalchemy.orm.exc.flusherror: new instance identity key (, (b'\x11\x0e\x84\x00\xe2\x9b\x11\xd4\xa7\x16dfud\x00\r',)) conflicts persistent instance
class item(db.model): __tablename__ = "items" # id_item = db.column(db.integer, autoincrement=true, primary_key=true) guid_item = db.column(db.binary(16), primary_key=true) id_project = db.column(db.integer,db.foreignkey("projects.id_project")) type = db.column(db.integer) name = db.column(db.string(50), nullable=false, index= true) created_at = db.column(db.datetime) updated_at = db.column(db.datetime) __mapper_args__ = { 'polymorphic_identity': 'items', 'polymorphic_on':type, 'with_polymorphic':'*' } __table_args__ = ( db.uniqueconstraint('name', 'id_project', name='_unique_name_project'), ) def __init__(self,creado_en=none): self.created_at = creado_en self.updated_at = creado_en class hub(item): __tablename__ = "hubs" __mapper_args__ = { 'polymorphic_identity': type_hub, 'with_polymorphic':'*' } guid_hub = db.column(db.binary(16), db.foreignkey(item.guid_item), primary_key=true) location = db.column(db.string(50)) comments = db.column(db.string(128)) def __init__(self, guid_hub=none, nombre=none, location=none,comments=none, id_project=none, creado_en=none, actualizado_en=none): self.type = type_hub self.guid_item = guid_hub self.guid_hub = guid_hub self.name = nombre self.id_project = id_project self.location = location self.comments = comments self.created_at = creado_en self.updated_at = actualizado_en 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) def __init__(self,guid_tag,project,item,type,created_at,updated_at): # self.guid_item = guid_tag self.guid_tag = guid_tag self.project = project self.item = item self.type = type self.created_at = created_at self.updated_at = updated_at
i found answer in docs. consider hub subclass of item. have change 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)
in other words must avoid have 2 copys of persistence object in same session.
Comments
Post a Comment