Usando Django con datos existentes

Estándar

En esta entrada, continuaremos con nuestro buscador de frases de los Simpson. Hasta ahora, tan solo hemos tenido acceso a los datos creados por la propia aplicación. Ahora vamos a ver cómo acceder a una base de datos existente. Este paso es muy importante, ya que nos permite crear una interfaz a un sistema de recolección y procesado de datos más complejo, que use otras tecnologías en paralelo.

Supongamos que tenemos una base de datos MySQL llamada simpsons_db en nuestro servidor local, con las frases de los simpson en la tabla simpsons_frases. Esta tabla tiene 4 columnas, con los mismos nombres que nuestro modelo CitaSimpsons. El código SQL para crear esta tabla es el siguiente:

CREATE TABLE IF NOT EXISTS `cita_simpsons` (
  `id` int NOT NULL AUTO_INCREMENT,
  `frase` text NOT NULL,
  `personaje` varchar(100) NOT NULL,
  `capitulo` int(11) NOT NULL,
  `temporada` int(11) NOT NULL,
  PRIMARY KEY (ID)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

Podemos rellenar esta tabla usando comandos INSERT o herramientas como HeidiSQL o PHPMyAdmin.

El siguiente paso será reescribir el modelo CitaSimpsons de modo que use una tabla existente. Para ello, cambiaremos nuestro fichero models.py, usando un comando de Django. Antes de eso, debemos cambiar la configuración de la base de datos de la aplicación en SQProject/settings.py. Para ello, añadiremos dos líneas al principio del fichero:

import pymysql
pymysql.install_as_MySQLdb()

Esto usará la librería pymysql para conectarse a MySQL; lo que nos ahorrará muchos dolores de cabeza. Antes de seguir, instalamos esta librería ejecutando pip install pymysql. En el mismo fichero, buscamos las línea que contienen:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

y las cambiamos por:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'simpsons_db',
        'USER': 'nombre_usuario',
        'PASSWORD': 'contraseña',
        'HOST': '127.0.0.1',
        'PORT': '3306',
    }
}

Esta configuración sustituirá el backend SQLite usado por defecto por la base de datos MySQL en la que están alojados los datos que queremos representar. Una vez configurado, podemos ejecutar el siguiente comando, que analizará nuestros datos y creará un modelo basado en ellos: python manage.py inspectdb > SQapp/models.py. Con esto «nos cargamos» nuestro querido models.py. Se habrá creado uno nuevo con los siguientes contenidos:

from __future__ import unicode_literals

from django.db import models


class CitaSimpsons(models.Model):
    frase = models.TextField()
    personaje = models.CharField(max_length=100)
    capitulo = models.IntegerField()
    temporada = models.IntegerField()

    class Meta:
        managed = False
        db_table = 'cita_simpsons'

Hay que tener en cuenta que hemos elegido el nombre de la tabla y las columnas de forma estratégica para que coincidan con los del modelo original, de modo que no tengamos que cambiar el resto del código de nuestra aplicación. Si esto no se hubiera hecho así, tendríamos que adaptar nuestro código (en el mundo real, normalmente crearemos este modelo antes de usarlo) o bien hacer un mapeo entre los nombres de la base de datos y los de la aplicación, como se muestra aquí. Antes de usar la aplicación, debemos actualizar la base de datos:

python manage.py migrate
python manage.py makemigrations
python manage.py migrate

Y por fin, podemos ejecutar el servidor con python manage.py runserver, y usar curl como se mostró en la última entrada.

Si bien esto parece una actualización pequeña, es un paso muy importante. Con esto podremos servir datos de bases de datos consolidadas, bien por que existan antes de nuestra aplicación, o bien por que pertenezcan a un sistema que use otros sistemas de diversas tecnologías en paralelo para actualizarla. En la siguiente entrada, añadiremos autenticación de usuario y puliremos nuestra aplicación.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *