Trabajando con Múltiples Bases de Datos en Django 2
En esta página:
Vamos hablar sobre un tema quizás más avanzado, pero para nada difícil que lo puedas entender, trataremos en este artículo sobre el trabajo con varias Bases de Datos en Django, no te pierdas este artículo que te ayudará y aumentará tus conocimientos con este genial Framework, si no sabes que es Django te recomendamos leer nuestro artículo Que es Django, Historia y tu primer Hola Mundo , vamos con el artículo.
Para trabajar con una Base de Datos el primer paso es abrir el archivo de tu proyecto llamado settings.py y busca la linea de configuración DATABASES en donde por defecto tiene una base de datos inicial que viene consigo cada ves que creas un nuevo proyecto con Django 2
1 2 3 4 5 6 7 8 9 10 11 |
# Database # https://docs.djangoproject.com/en/dev/ref/settings/#databases DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), } } |
Dentro de esa línea puedes añadir varias Bases de Datos o las que sean necesarias para el objetivo que tienes en mente, por ejemplo a continuación vamos añadir 2 bases de datos y quedarían 3 bases de datos en la configuración de DATABASES , dejaremos el tipo de Base de Datos SQL Lite que vino por defecto y añadiremos Postgress SQL y MySQL
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
# Database # https://docs.djangoproject.com/en/dev/ref/settings/#databases DATABASES = { 'gelatinas': { 'NAME': 'basededatos1', 'ENGINE': 'django.db.backends.sqlite3', # Base de de Datos SQL Lite 'USER': 'usuario1', 'PASSWORD': 'pass1' }, 'refrescos': { 'NAME': 'basededatos2', 'ENGINE': 'django.db.backends.postgresql', # Base de Datos Postgres SQL 'USER': 'usuario2', 'PASSWORD': 'pass2' }, 'tortas': { 'NAME': 'basededatos3', 'ENGINE': 'django.db.backends.mysql', # Base de Datos MySQL 'USER': 'usuario3', 'PASSWORD': 'pass3' } } |
Puedes ver que la primera base de datos que se llamaba default, le hemos cambiado el nombre a gelatinas, ya que no tiene sentido llamarlo default, si deseas puedes dejar ese dato como ‘default’:{}, y debajo continuar agregando las demás bases de datos
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
# Database # https://docs.djangoproject.com/en/dev/ref/settings/#databases DATABASES = { 'default': {}, 'gelatinas': { 'NAME': 'basededatos1', 'ENGINE': 'django.db.backends.sqlite3', # SQL Lite 'USER': 'usuario1', 'PASSWORD': 'pass1' }, ... } |
Nota: Para que tu proyecto soporte las base de datos que añadas en tu configuración DATABASES debes de instalar las librerías necesarias para darle soporte real a dichas Bases de Datos, por otro lado poco a poco veremos cosas más complejas con Bases de Datos en Django y te enseñaremos como usar los módulos conectores y librerías para que dichas bases de datos funcionen sin problemas en tu proyecto.
Si intentas acceder a una base de datos que no exista o no este configurada en DATABASES Django te arrojará el mensaje de excepción django.db.utils.ConnectionDoesNotExist en pantalla.
Migraciones
Si ya tienes tus Bases de Datos creadas, tienes la posibilidad de crear migraciones, con estas migraciones se insertarán las tablas determinadas para tu proyecto, pero puedes ver que tienes 3 Bases de Datos, si necesitas ejecutar migraciones debes especificar al final del comando el nombre de la base de datos que vas aplicarle la migración –database=nombredelabasededatos
1 2 3 4 5 |
$ ./manage.py migrate --database=gelatinas $ ./manage.py migrate --database=refrescos $ ./manage.py migrate --database=tortas |
Cada linea se ejecuta por separado en la consola de comandos, para tener cuidado y no cometer errores.
Enrutadores
Para manejar las migraciones mencionadas anteriormente y gestionar otros detalles debes de crear una Clase que te permita enrutar a la Base de Datos que quieres emplear, crearemos la clase llamadas GelatinasRouter
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
class GelatinasRouter: """ Con este método db_for_read le decimos a Django que debe usar la base de datos gelatina para las operaciones de lectura """ def db_for_read(self, model, **hints): if model._meta.app_label == 'postre': return 'gelatinas' # Seleccionamos la Base de Datos Gelatina return None """ Con el método db_for_write le decimos a Django que base de datos debe usar para guardar los datos de nuestra aplicación """ def db_for_write(self, model, **hints): if model._meta.app_label == 'auth': return 'gelatina' # Seleccionamos la Base de Datos Gelatina return None """ En esta sección Especificamos una relación entre dos elementos u objetos """ def allow_relation(self, elem1, elem2, **hints): if elem1._meta.app_label == 'postre' elem2._meta.app_label == 'postre': return True return None """ Indicamos si es que las migraciones se deben ejecutar en la base de datos 'gelatinas' """ def allow_migrate(self, db, app_label, model_name=None, **hints): if app_label == 'postre': return db == 'gelatinas' return None |
Ahora si deseas utilizar las demás bases de datos en Django puedes crear una nueva clas, le podemos llamar OtrasDbRouter
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
import random class OtrasDbRouter: def db_for_read(self, model, **hints): """ Para hacerlo dinámico le decimos que seleccione aleatoriamente una de las 2 base de datos 'gelatina' o 'postres' """ return random.choice(['refrescos', 'tortas']) def db_for_write(self, model, **hints): """ Aca la operación para escribir en las bases de datos 'gelatina' y 'postres' """ return 'primary' def allow_relation(self, elem1, elem2, **hints): """ Acá configuramos las relaciones entre elementos o objetos de la DB """ db_list = ('refrescos', 'tortas') if elem1._state.db in db_list and elem2._state.db in db_list: return True return None def allow_migrate(self, db, app_label, model_name=None, **hints): """ Acá Permitimos si las migraciones se podrán llevar a cabo """ return True |
Ahora debes de ir a tu archivo settings.py y agregar las 2 clases de enrutamiento que hemos creado
1 2 3 |
DATABASE_ROUTERS = ['path.to.GelatinasRouter', 'path.to.OtrasDbRouter'] |
El orden en que coloquemos las rutas es el orden en que se aplicarán los comandos que ejecutemos.
Habiendo enrutado las bases de datos puedes usar operaciones conocidas
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
# Seleccionar un elemento de la base de datos 'gelatinas' gf = Gelatinas.objects.get(codigo='GF') gf.nombre = 'Gelatina de Fresa' # Guardamos un elemento de la base de datos 'gelatinas' gf.save() # Seleccionamos un elemento de la base de datos 'refrescos' rn = Refrescos.objects.get(nombre='Refresco de Naranja') # A new object has no database allocation when created mh = Book(title='Mostly Harmless') # Seleccionamos la base de datos 'tortas' Author.objects.using('tortas').all() # Grabamos en la base de datos 'tortas' tr.save(using='tortas') # Eliminar una torta que tiene el código 'tc' de la base de datos 'tortas' tc = Tortas.objects.using('tortas').get(codigo='tc') tc.delete() |
Existen muchas más operaciones que puedes realizar con múltiples Bases de Datos en Django.
Síguenos en las Redes Sociales para que no te pierdas nuestros próximos contenidos.
- Django
- 13-09-2018
- 13-09-2018
- Crear un Post - Eventos Devs - Foro