Skip to content

Instantly share code, notes, and snippets.

@kkc
Forked from jleclanche/get_or_create.py
Created September 8, 2020 07:40
Show Gist options
  • Save kkc/da4b7f1a9374f0fba41e93c23d6a7366 to your computer and use it in GitHub Desktop.
Save kkc/da4b7f1a9374f0fba41e93c23d6a7366 to your computer and use it in GitHub Desktop.
SQLAlchemy get or create
def get_or_create(session, model, defaults=None, **kwargs):
"""
Get or create a model instance while preserving integrity.
"""
try:
return session.query(model).filter_by(**kwargs).one(), False
except NoResultFound:
if defaults is not None:
kwargs.update(defaults)
try:
with session.begin_nested():
instance = model(**kwargs)
session.add(instance)
return instance, True
except IntegrityError:
return session.query(model).filter_by(**kwargs).one(), False
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment