Skip to content

Instantly share code, notes, and snippets.

@rmoorman
Forked from codeb2cc/gist:3302754
Created January 29, 2014 17:41
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save rmoorman/8693030 to your computer and use it in GitHub Desktop.
Save rmoorman/8693030 to your computer and use it in GitHub Desktop.
# -*- coding: utf-8 -*-
from sqlalchemy.exc import IntegrityError
from sqlalchemy.sql.expression import ClauseElement
def _get_or_create(session, model, defaults=None, **kwargs):
try:
query = session.query(model).filter_by(**kwargs)
instance = query.first()
if instance:
return instance, False
else:
session.begin(nested=True)
try:
params = dict((k, v) for k, v in kwargs.iteritems() if not isinstance(v, ClauseElement))
params.update(defaults)
instance = model(**params)
session.add(instance)
session.commit()
return instance, True
except IntegrityError as e:
session.rollback()
instance = query.one()
return instance, False
except Exception as e:
raise e
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment