Skip to content

Instantly share code, notes, and snippets.

@ninjix
Forked from bruth/gist:7467130
Created July 31, 2014 12:20
Show Gist options
  • Save ninjix/659204ef8b6c9f9396ee to your computer and use it in GitHub Desktop.
Save ninjix/659204ef8b6c9f9396ee to your computer and use it in GitHub Desktop.
import string
from random import SystemRandom
from django.db import connections
key_chars = string.ascii_letters
random = SystemRandom()
class adhoc_db(object):
"""Context manager that temporarily adds a database connection.
Exceptions are passed through, but ensures the connection and
settings have been cleaned up from `connections.databases`.
Usage:
with adhoc_db(settings) as conn:
# do something with...
"""
def __init__(self, settings, alias=None):
if alias is None:
key = ''.join(random.choice(key_chars) for i in xrange(10))
# TODO should this lock?
assert alias not in connections.databases or \
connections.databases[alias] == settings
self.alias = alias
connections.databases[alias] = settings
self.connection = connections[alias]
def __enter__(self):
return self.connection
def __exit__(self, *excinfo):
self.connection.close()
del connections.databases[self.alias]
def adhoc_db_decorator(settings, alias=None):
def decorator(func):
def inner(*args, **kwargs):
with adhoc_db(settings, alias):
return func(*args, **kwargs)
return inner
return decorator
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment