В рамках задачи потребовалось сделать так, что бы django умела поднимать соединение до различных пользовательских баз данных.
Т.к. параметры подключения у всех разные DATABASE_ROUTERS отпадает.
Почитав форумы, документацию пришел к такому кейсу:
в Middleware.process_request прописываем connections:
class UserCommonMiddleware(object):
u"""
Middleware для выполнения общих дополнительных действий с запросом
"""
def process_request(self, request):
# ....
server_name = request.user.server_name
# динамически меняем коннект до базы данных для юзеров
connections.databases['sip_asteriskcdrdb'+server_name] = get_connection(request.user)
роутинг ДБ делаем таким образом:
from django.db import connections
REMOTE_APP = [...]
class DBRouter(object):
"""
A router to control all database operations
"""
def db_for_read(self, model, **hints):
if model._meta.app_label in REMOTE_APP:
return '...'
return None
db_for_write = db_for_read
А сами запросы делаются так:
server_name = request.user.server_name
QAgent.objects.using(QAgent.objects.db+server_name).filter(...)
Либо
from django.db import connections,
def sqltodict(model, query, param = None, router = None, server_name = None):
allias = router().db_for_read(model)
cursor = connections[allias+server_name].cursor()
...
Граждане Гуру, как можно избавится от богомерзких using во всех запросах или быть может есть способ более красиво решить данную задачу?
Updated 19 Aug. 2014, 20:46 by faunrisf0b8203ce7df4bce.