Sorry, You are right.

I want to perform and *insert or update* but I always get this error:

sqlalchemy.exc.IntegrityError: (raised as a result of Query-invoked 
> autoflush; consider using a session.no_autoflush block if this flush is 
> occurring prematurely) (pymysql.err.IntegrityError) (1062, "Duplicate entry 
> '\\x11\\x0E\\x84\\x00\\xE2\\x9B\\x11\\xD4\\xA7\\x16DfUD\\x00\\x0D' for key 
> 'PRIMARY'") [SQL: 'INSERT INTO tags (guid_tag, id_project, guid_item, type, 
> created_at, updated_at) VALUES (%(guid_tag)s, %(id_project)s, 
> %(guid_item)s, %(type)s, %(created_at)s, %(updated_at)s)'] [parameters: 
> {'guid_item': b'\x11\x0e\x84\x00\xe2\x9b\x11\xd4\xa7\x16DfUD\x00"', 
> 'id_project': 1, 'created_at': '2016-03-22 06:00:01', 'updated_at': 
> '2016-03-23 06:21:31', 'type': 0, 'guid_tag': 
> b'\x11\x0e\x84\x00\xe2\x9b\x11\xd4\xa7\x16DfUD\x00\r'}]


There is a row in DB that has the same PK, so I expect merge bring that 
record from DB but instead of it perform a new insert as error message 
shows. 

The whole definition of clases and models.

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


El sábado, 26 de marzo de 2016, 17:26:04 (UTC+1), Mike Bayer escribió:
>
>
>
> On 03/26/2016 12:06 PM, Ricardo Champa wrote: 
> > AFAIK merge performs and |insert or update| so what I'm doing is pretty 
> > simple. There is a relation of 1 to N between Hubs and Tags. So when I 
> > try to make a merge on tag and hub, hub goes well and load from DB the 
> > existent hub and make an update, but fails when 
> > |db.session.merge(nuevo_tag)| is executed throwing an exception because 
> > behind the scenes is try to make an insert, even if the tag previously 
> > exist. What I 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 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()| 
>
> nothing seems wrong with the small amount code pictured and also i don't 
> know what exception you are getting, nor do I have enough context to 
> understand the issue in general, so please provide minimal, working 
> mappings and a demonstration per the guidelines at 
> http://stackoverflow.com/help/mcve, thanks! 
>
>
> > 
> > -- 
> > You received this message because you are subscribed to the Google 
> > Groups "sqlalchemy" group. 
> > To unsubscribe from this group and stop receiving emails from it, send 
> > an email to [email protected] <javascript:> 
> > <mailto:[email protected] <javascript:>>. 
> > To post to this group, send email to [email protected] 
> <javascript:> 
> > <mailto:[email protected] <javascript:>>. 
> > Visit this group at https://groups.google.com/group/sqlalchemy. 
> > For more options, visit https://groups.google.com/d/optout. 
>

-- 
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.

Reply via email to