Skip to content

Instantly share code, notes, and snippets.

@bruth
Last active August 9, 2024 03:40
Show Gist options
  • Save bruth/7467130 to your computer and use it in GitHub Desktop.
Save bruth/7467130 to your computer and use it in GitHub Desktop.
Django adhoc database
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
@awhillas
Copy link

awhillas commented Aug 9, 2024

I want to use this in a view and have a per view DB. How would that work?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment