Django y las Bases de Datos

No se vosotros, pero si algo me gusta poco programar es el típico código para unir nuestras clases del modelo con la base de datos. Una de las grandes desventajas de escribir este código a mano es que es sumamente repetitivo, lo que lleva a muchos errores de copy&paste.
Este aspecto desde luego no es nuevo en el desarrollo de aplicaciones, los requerimientos de persistencia son constantes en una aplicación.
Una primera aproximacion fué las bases de datos orientadas a objetos, recuerdo que en alguna clase de la universidad vimos FastObjects o la extension de Oracle para Objectos, sin embargo esta aproximación no acabo de imponerse. La opción que mas se utilizaba fué usar APIs para traducir los objetos tradicionales a Bases de Datos Relacionales típicas.
Posiblemente esta opción fue la mas extendida por la gran difusión y optimizacion de dichos motores de bases de datos.

django y las bases de datos

No se vosotros, pero si algo me gusta poco programar es el típico código para unir nuestras clases del modelo con la base de datos. Una de las grandes desventajas de escribir este código a mano es que es sumamente repetitivo, lo que lleva a muchos errores de copy&paste.

Este aspecto desde luego no es nuevo en el desarrollo de aplicaciones, los requerimientos de persistencia son constantes en una aplicación.

Una primera aproximacion fué las bases de datos orientadas a objetos, recuerdo que en alguna clase de la universidad vimos FastObjects o la extension de Oracle para Objectos, sin embargo esta aproximación no acabó de imponerse. La opción que mas se utilizaba fué usar APIs para traducir los objetos tradicionales a Bases de Datos Relacionales típicas.

Posiblemente esta opción fue la mas extendida por la gran difusión y optimización de dichos motores de bases de datos.

Hablando de mi experiencia y en el ámbito de los lenguajes “mayores”, es decir Java o C#, empecé experimentando con Hibernate en lo que se refiere a Java y con los DataSource tipados en lo respectivo a .NET.

Mas tarde se publicó finalmente EJB 3.0 y surgió JPA. Lo cual añadio a Java una api bastante decente y además oficial que iba a favorecer bastante la programación de estas labores. Quizás en otro post hablaremos de JPA😉

Cada evolución y versión de las APIs mejoraban un poco mas lo que teniamos anteriormente, y nos permitia quitarnos cada vez mas codigo de “pegamento” entra la BBDD y nuestras clases.

Según la aplicación, actualmente es posible ahorrarse mucho código de este tipo, lo que sin duda es una gran ventaja.

Todo no son paños calientes y muchas veces no nos quedará mas remedio que seguir programando algunos fragmentos de este tipo de código ya que las APIs no siempre se adaptan a las necesidades que suelen surgir cuando se plasman los requisitos del cliente, sin embargo estos son los casos especiales.

Hablando ya de lo que en esta serie nos preocupa, django nos va a ayudar bastante a la hora de autogenerar este código. De hecho a priori no tendremos que escribir ni una sola sentencia SQL para persistir los datos.

En el anterior post, dejamos el servidor funcionando, ahora vamos a crear una aplicación dentro de ese servidor para poder meter nuestro código. Para ello hay que ejecutar

$ python manage.py startapp bookstore

Y el script manage.py nos creará el directorio bookstore con los ficheros iniciales.

De los ficheros iniciales que nos ha creado el script anterior, vamos a centrarnos en el fichero models.py, por ejemplo digamos que queremos escribir una aplicación para manejar libros, empezaremos creando nuestras clases de modelo,

Para ello editamos el fichero models.py y añadimos la clase que representa a un libro:

from django.db import models
class Book(models.Model):
        author = models.CharField(max_length=100)
        title = models.CharField(max_length=100)
        creationDate = models.DateTimeField('date created')

        def __unicode__(self):
                return self.author + ": " + self.title

La definición de la clase ya nos da muchas pistas de como funciona internamente django. Primero podemos ver que nuestras clases de modelo heredan de models.Model, lo que nos va a proporcionar toda la funcionalidad de búsquedas, creación, etc.

El módulo models nos proporciona métodos para crear las variables de nuestras clases módelo, en lugar de crear tipos básicos de Python. En el ejemplo vemos como crear un campo de Texto o un campo de tipo Fecha.

Una cosa que echamos en falta en el ejemplo es como representar las relaciones entre clases, para ello vamos a modificar ligeramente el ejemplo, extrayendo el campo autor, a una clase nueva, por lo que quedaria algo como:

from django.db import models
class Author(models.Model):
        name = models.CharField(max_length=100)
        birthDate = models.DateTimeField('Birth date')
        def __unicode__(self):
                return self.name

class Book(models.Model):
        author = models.ForeignKey(Author)
        title = models.CharField(max_length=100)
        creationDate = models.DateTimeField('date created')
        def __unicode__(self):
                return self.author + ": " + self.title

Como vemos, usamos la clase ForeignKey para representar la asociación entre libro y autor, el resto de las relaciones también podemos implementarlas sin problemas, usando la clases ManyToMany o OneToOne.

Como siempre, nos gusta ver las cosas funcionando, para ello vamos a usar el comando manage.py para obtener diversas cosas, sin embargo, antes de nada es necesario incluir nuestra aplicación dentro de la lista de aplicaciones instaladas en nuestro proyecto. Para ello editamos el fichero settings.py y añadimos una linea con nuestra aplicación, algo como:

INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'pruebadjango.bookstore',
)

Siendo “pruebadjango” el nombre de nuestro proyecto

Otro paso necesario es configurar los datos de acceso a la base de datos, para este ejemplo vamos a usar sqlite, una base de datos muy sencilla, que puede residir en un fichero de disco y que viene dentro de la distribución de python, lo que nos va a simplificar mucho las labores de configuración.

Para ello debemos editar de nuevo el fichero settings.py y modificar las lineas:

DATABASE_ENGINE = 'sqlite3'           
DATABASE_NAME = '/home/roberto/Projects/django/bbdd'

Siendo el DATABASE_NAME la ruta al fichero que va a guardar la base de datos.

Una vez añadida la aplicación a la lista ya podemos empezar a ver cositas

El script manage.py tiene diversas utilidades que nos van a servir para ver como django transforma nuestras clases Python a sql. Así por ejemplo si ejecutamos:

$ python manage.py sqlall bookstore

Obtendremos las sentencias SQL generadas para nuestras clases, para nuestro ejemplo la salida es:

BEGIN;
CREATE TABLE "bookstore_author" (
    "id" integer NOT NULL PRIMARY KEY,
    "name" varchar(100) NOT NULL,
    "birthDate" datetime NOT NULL
)
;
CREATE TABLE "bookstore_book" (
    "id" integer NOT NULL PRIMARY KEY,
    "author_id" integer NOT NULL REFERENCES "bookstore_author" ("id"),
    "title" varchar(100) NOT NULL,
    "creationDate" datetime NOT NULL
)
;
CREATE INDEX "bookstore_book_author_id" ON "bookstore_book" ("author_id");
COMMIT;

O también podemos ejecutar:

$ python manage.py validate

Para validar que nuestros modelos estan bien definidos.

Finalmente si ejecutamos:

$ python manage.py syncdb

Se crearan las tablas para nuestros modelos en la base de datos.

Una respuesta a Django y las Bases de Datos

  1. JUAN CARLOS dice:

    Una de las ventajas de django es que dijeras tu ” ya no es necesario escribir una sentencia SQL” mi pregunta es, que pasa cuando tienes Querys Realmente muy personalizados y complejos

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: