-
-
Save ninjix/659204ef8b6c9f9396ee to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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