Динамически создать базу данных djangoMySql

Форум по Mysql
Ответить
Anonymous
 Динамически создать базу данных django

Сообщение Anonymous »

В веб -приложении Django при входе в систему я сохраняю имя базы данных в сеансе. Мне нужен метод для динамического создания базы данных, используя это имя, которое сохраняется в сеансе пользователя. Я не хочу использовать «Использование ()», потому что мое нанесение уже сделано, и это даст мне большую работу, а также не настраивая несколько баз данных в ваших настройках (потому что мои базы данных создаются динамически), если есть другой как я хотел бы знать. Может быть, это невозможно, я понимаю, если это так ... < /p>
Я попробовал Middlewares, маршруты, резьбы, декораторы, но, возможно, я думаю, что я сделал бы что -то не так. Я исчерпал свои попытки. Насколько я мог бы пойти, я захожу в правильную базу данных до второго экрана моего приложения, когда я просматриваю приложение, 3 экрана я передаю базу данных, возвращается к по умолчанию. < /P>
Промежуточное программное обеспечение: < /p>
import re
from django.utils.deprecation import MiddlewareMixin
from django.db import connections
from .thread import set_banco_academia

class DatabaseMiddleware(MiddlewareMixin):
def process_request(self, request):
"""
Middleware que define dinamicamente o banco de dados a ser usado
com base na sessão do usuário e adiciona a conexão ao Django.
"""
if not hasattr(request, "session"): # Garante que a sessão foi carregada
return

# Obtém o banco armazenado na sessão ou usa "default"
banco_academia = request.session.get("banco_academia", "default")

print(f"🔍 Banco selecionado na sessão: {banco_academia}")

# Valida o nome do banco para evitar SQL Injection
if self.is_valid_database_name(banco_academia):
set_banco_academia(banco_academia)
else:
set_banco_academia("default")
banco_academia = "default"

# Se o banco ainda não estiver em connections, adicionamos dinamicamente
if banco_academia not in connections.databases:
connections.databases[banco_academia] = {
'ENGINE': 'django.db.backends.mysql', # Ou outro engine
'NAME': banco_academia,
'USER': 'root',
'PASSWORD': '',
'HOST': 'localhost',
'PORT': '3306',
'ATOMIC_REQUESTS': False,
'AUTOCOMMIT': True,
'CONN_MAX_AGE': 0,
'CONN_HEALTH_CHECKS': False,
'OPTIONS': {},
'TIME_ZONE': None,
'TEST': {
'CHARSET': None,
'COLLATION': None,
'MIGRATE': True,
'MIRROR': None,
'NAME': None,
},
}
print(f"🔗 Conexão adicionada dinamicamente para o banco: {banco_academia}")

def is_valid_database_name(self, name):
"""Valida se o nome do banco é seguro e segue um padrão esperado"""
return bool(re.match(r"^[a-zA-Z0-9_]+$", name))
< /code>
Поток: < /p>
import threading

_local = threading.local()

def set_banco_academia(banco):
"""Define o banco de dados na thread local"""
_local.banco_academia = banco

def get_banco_academia():
"""Obtém o banco de dados armazenado na thread local"""
return getattr(_local, "banco_academia", "default")
< /code>
Router: < /p>
from django.db import connections
from .thread import get_banco_academia

class ClubGymRouter:
def db_for_read(self, model, **hints):
"""Define o banco de leitura dinamicamente"""
banco_academia = get_banco_academia()
if banco_academia in connections.databases:
return banco_academia
return "default"

def db_for_write(self, model, **hints):
"""Define o banco de escrita dinamicamente"""
banco_academia = get_banco_academia()
if banco_academia in connections.databases:
return banco_academia
return "default"

def allow_relation(self, obj1, obj2, **hints):
"""Permite relações entre objetos do mesmo banco"""
db_set = {get_banco_academia(), "default"}
return obj1._state.db in db_set and obj2._state.db in db_set

def allow_migrate(self, db, app_label, model_name=None, **hints):
"""Define se a migração pode ser feita no banco correto"""
return db == get_banco_academia() or db == "default"
< /code>
Вот как я сохраняю имя базы данных в сеансе < /p>
request.session["banco_academia"] = nome_banco
request.session.modified = True # 🔥 Marca como modificada
request.session.save()


Подробнее здесь: https://stackoverflow.com/questions/794 ... ase-django
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «MySql»