python - SQLALchemy session.merge is not working -


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