Publicidad

Como configurar múltiples Bases de Datos con Django


Por Alex el 14/06/2023, Comentar el artículo

Comparte este artículo:      




Desde Django podemos trabajar con una o varias bases de datos definiendo diferentes conexiones en el fichero settings.py.


Puede ser diferentes motores de base de datos, en el ejemplo veremos dos, conexión a MySql y a sqlite3

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

e instalamos los requerimientos con el fichero requirements.txt

pip install -r requirements.txt

Requerimientos a instalar en el proyecto

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:

Estructura del proyecto

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,
})

Dejo todo el código en un repositorio de git: https://github.com/depruebas/django-multiples-bbdd

Y esto es todo, feliz programming
Saludos
Alex.
/


Si te ha gustado el artículo compartelo en:      




Añadir un comentarios:

Nombre:
Email: (no se publica el email)




SIGUENOS EN

ARCHIVO

Publicidad

.