I have a model with an ID column set as the primary key, though i'd like to be 
able to identify records by 3 other columns.
For this situation, I've added a classmethod that will fetch the record if 
found or a new record if not.
The problem i'm having is that every once in a while, I get IntegrityError 
trying to flush a change

class Foo(Base):
    __table_args__ = (sa.UniqueConstraint('bar', 'baz', 'qux'),)

    id = sa.Column(Identifier, sa.Sequence('%s_id_seq' % __tablename__), 
nullable=False, primary_key=True)
    bar = sa.Column(sa.BigInteger)
    baz = sa.Column(sa.BigInteger)
    qux = sa.Column(sa.BigInteger)
    a1 = sa.Column(sa.BigInteger)
    a2 = sa.Column(sa.BigInteger)

    @classmethod
    def get(cls, bar=None, baz=None, qux=None, **kwargs):
        item = session.query(cls).\
            filter(cls.bar== bar).\
            filter(cls.baz == baz).\
            filter(cls.qux == qux).\
            first()

        if item:
            for k, v in kwargs.iteritems():
                if getattr(item, k) != v:
                    setattr(item, k, v)
        else:
            item = cls(bar=bar, baz=baz, qux=qux, **kwargs)

        return item

This is the code I use to add/update records:

foo = Foo.get(**item)
session.merge(foo)

I'm struggling with this problem for some time now, and would appreciate any 
help ...

-- 
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 sqlalchemy+unsubscr...@googlegroups.com.
To post to this group, send email to sqlalchemy@googlegroups.com.
Visit this group at http://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to