为每个用户Django提供单独的数据库

时间:2019-03-26 07:03:56

标签: python django database

我现在正在根据以下内容创建数据库:Saperate PostgreSQL db for each client, with automated migrations on creating client on single Django app and on same server

现在,我想为每个用户提供数据库。只有在设置文件的DATABASES变量中存在的情况下,我们才能从数据库路由器返回数据库。

是否有人知道如何服务在服务器上创建但未添加到settings.py中的db,这取决于已登录的用户。 将为用户提供一个主数据库,其中保存了用户与数据库名称的关系。

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

0 个答案:

没有答案