Я создаю базу данных в соответствии с этим сейчас: Saperate PostgreSQL db для каждого клиента, с автоматизированными миграциями при создании клиента в одном приложении Django и на одном сервере
Теперь я хочу обслуживатьдБ на пользователя.Мы можем вернуть дБ из дБ-маршрутизаторов, только если они существуют в переменной DATABASES
в файле настроек.
Кто-нибудь знает, как обслуживать БД, которые созданы на сервере, но не добавлены в settings.py
, что будет соответствовать зарегистрированному пользователю.Для пользователя будет основная база данных, в которой сохраняются их отношения с именем базы данных.
Settings.py
DATABASE_ROUTERS = ['app.router_middleware.DataBaseRouter']
DATABASES = {'default':
{
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'abc',
'USER': 'xyz',
'PASSWORD': '*****',
'HOST': 'localhost',
'PORT': '5432',
}
}
import django
django.setup()
from Client.views import ALL_DB
DATABASES.update(ALL_DB)
Client.views
ALL_DB = { x.db_name: {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': x.db_name,
'USER': 'xyz',
'PASSWORD': '****',
'HOST': 'localhost',
'PORT': '5432',
} for x in Client.objects.all()}
router_middleware.py
db_name = 'default'
class RouterMiddleware(CoreSessionMiddleware):
def process_request(self, request):
if request.user.is_authenticated() :
user = request.user
if ClientEmployee.objects.filter(user=user).exists():
client_employee = ClientEmployee.objects.get(user=user)
db_name = client_employee.client.db_name
class DataBaseRouter(object):
def db_for_read(self, model, **hints):
return db_name
def db_for_write(self, model, **hints):
return db_name