Para el ejemplo voy a utilizar el proyecto anterior para ejecutar queries raw Como ejecutar consultas RAW en django y dentro de este código modificare las clases que acceden a la base de datos.
Lo primero clonar el repositorio:
git clone https://github.com/depruebas/django-queries-raw.git
Después de clonarlo le cambio el nombre y activo el entorno
mv django-queries-raw django-multiples-bbdd
source .venv/bin/activate
pip install -r requirements.txt
Este es un proyecto que ya esta preparado para trabajar con una base de datos MySql
Y que tiene la siguiente configuración en el fichero settings.py del proyecto principal:
DATABASES = {
# 'default': {
# 'ENGINE': 'django.db.backends.sqlite3',
# 'NAME': BASE_DIR / 'db.sqlite3',
# }
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'sakila',
'USER': 'root',
'PASSWORD': 'root',
'HOST': '172.21.0.2',
'PORT': '3306',
}
}
Descomenta la conexión por defecto, le cambias el nombre (yo la llamaré sql_lite) y añade una por defecto vacía, de la siguiente forma:
DATABASES = {
'default': {},
'sql_lite': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
'sakila': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'sakila',
'USER': 'root',
'PASSWORD': 'root',
'HOST': '172.21.0.2',
'PORT': '3306',
}
}
El fichero db.sqlite3 de la conexión sql_lite tiene que estar en el directorio principal, si no lo tienes creado lo puedes crear con esta herramienta: https://sqlitebrowser.org y quedará en disco de la siguiente forma:
Ahora en el fichero del modelo base baseModel.py voy a añadir los métodos para poder cambiar de base de datos, eliminar lo que hay y poner lo siguiente:
from django.db import connections
class BaseModel:
def __init__(self, db_alias='default'):
self._db_alias = db_alias
@property
def db_alias(self):
return self._db_alias
@db_alias.setter
def db_alias(self, value):
if value not in connections:
raise ValueError(f"La base de datos '{value}' no está configurada en settings.DATABASES.")
self._db_alias = value
def ExecuteQuery ( self, sql):
if self.db_alias not in connections:
raise ValueError(f"La base de datos '{self.db_alias}' no está configurada en settings.DATABASES.")
connection = connections[self.db_alias]
cursor = connection.cursor()
cursor.execute( sql)
columns = [col[0] for col in cursor.description]
rows = [ dict(zip(columns, row)) for row in cursor.fetchall() ]
return [ { 'columns': columns,
'rows': rows,
'total': cursor.rowcount
} ]
def Execute ( self, sql):
if self.db_alias not in connections:
raise ValueError(f"La base de datos '{self.db_alias}' no está configurada en settings.DATABASES.")
connection = connections[self.db_alias]
cursor = connection.cursor()
cursor.execute( sql)
return [ cursor.fetchone() ]
A la conexión le pasamos el db_alias que es el nombre de la conexión a la que queremos conectar, ahora modificaré el fichero filmModel.py donde se realizan las consultas a la base de datos y pondré una consulta a casa base de datos y quedará de la siguiente forma:
from .baseModel import BaseModel
class FilmModel(BaseModel):
def GetAllFilms():
model = BaseModel()
model.db_alias = 'sakila'
sql = "SELECT film_id, title, release_year, language_id, special_features \
FROM `film` \
Order by film_id desc limit 3"
return ( model.ExecuteQuery( sql))
def GeAllUSers():
model = BaseModel()
model.db_alias = 'sql_lite'
sql = "SELECT * FROM users"
return ( model.ExecuteQuery( sql))
A la propiedad model.db_alias en cada método le pasamos la base de datos que toca.
Y ahora en la vista (views.py) llamamos a los dos métodos:
from django.shortcuts import render
from django.core.serializers import serialize
from django.http import HttpResponse, JsonResponse
from .filmModel import FilmModel
def index( request):
films = FilmModel.GetAllFilms()
users = FilmModel.GeAllUSers()
#return JsonResponse( films, safe=False)
return render(request, 'index.html', {
'films': films,
'users': users,
})
y por pantalla podrás ver el resultado en formato JSON si se habilita este retorno:
return JsonResponse( films, safe=False)
O se lo pasamos al template con este otro retorno:
return render(request, 'index.html', {
'films': films,
'users': users,
})
Y esto es todo, feliz programming
Saludos
Alex.
/