LogoEjk

TEST

Usando Django con datos existentes

April 10, 2016

En esta entrada 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.

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 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.

Return to blog