Django y las Bases de Datos

junio 24, 2009
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.

Anuncios

Introducción a Django

junio 15, 2009

Django DemoEn el anterior post hablamos en general de los frameworks de desarrollo rápido que habían surgido recientemente. Concretamente nos vamos a centrar en Django por los motivos que comentamos anteriormente.

Django surgió en una redacción de noticias donde requerían una herramienta flexible que les permitiera realizar cambios de una forma ágil. Básicamente el framework nos va a permitir crear aplicaciones basadas en el modelo MVC, que usen operaciones de CRUD ( Create, read, update and delete) o como lo conocemos en español el típico Altas, Bajas Modificaciones y Consultas.

¿De que forma nos va a ayudar?
Principalmente creando toda la lógica de la gestión de nuestras clases con la base de datos.
Además de proporcionarnos toda la API para la gestión de los datos, Django nos va a proporcionar dos cosas adicionales:

  • Una interfaz web genérica auto-generada para gestionar los datos
  • Una API para construir webs que gestionen estos datos.

Durante las sucesivas entradas veremos a ver si realmente el framework nos va a ayudar a crear nuestra aplicación, particularmente en mi contacto con este tipo de frameworks si te adaptas bien a la filosofía del framework nos va a ayudar bastante en la creación de nuestra aplicación.

En este primer post vamos a ver la instalación del framework y después crearemos el esqueleto de nuestro primer proyecto.

A la hora de instalarlo tenemos varias alternativas, si usamos una distribución que incluya django como paquete solo tendremos que instarlo, ahora mismo estoy escribiendo desde Ubuntu 9.04 y solo he tenido que ejecutar apt-get install python-django.
Si nuestra distribución no esta soportada directamente o bien usamos OS X o Windows, debemos bajarnos la ultima versión del sitio web de django ( http://www.djangoproject.com/download/ ) y ejecutar setup.py install con privilegios de administrador.

Una vez que lo tenemos instalado el primer paso es ejecutar el script que va a crear el esqueleto de nuestra aplicación:

$ django-admin startproject pruebadjango

Con esta orden se nos creara un nuevo directorio llamado pruebadjango con los siguientes ficheros relevantes:

  • manage.py: Script que nos va a permitir realizar las diferentes labores de administración sobre la aplicación como gestionar el servidor web embebido que tiene django o la relación con la base de datos
  • settings.py: Fichero que contiene los parámetros de configuración de nuestra aplicacion, como por ejemplo los datos de conexión a la base de datos
  • urls.py: Fichero donde se especifican los mapeos entre las URLs y los paquetes que van a gestionar esa URL, para los que hemos usado Java y sus aplicaciones web, seria una especie de web.xml

Como buen impaciente ;), lo primero que haremos sera ejecutar el servidor, aunque no tiene nada que mostrar, al menos nos confirmará que vamos por el buen camino.

Para ejecutar el servidor debemos escribir:

$ python manage.py runserver

Y si navegamos con el browser a la direccion http://127.0.0.1:8000/ veremos la imagen dela captura, lo que confirmará que tenemos instalado django correctamente y creado nuestro esqueleto que nos va a servir como base en futuras entregas.

Hablando del servidor, una de mis inquietudes con estos frameworks y que aun no ha sido del todo resuelta es como se comportan en entornos donde la exigencia es grande. Aplicaciones web basadas en java reposan en servidores de aplicaciones muy potentes que nos garantizan un buen rendimiento. En este aspecto Grails con Groovy tiene algo ganado, al fin y al cabo es java, y puede aprovecharse de todo lo que apoya a Java. En el caso de frameworks como el que nos ocupa, la fiabilidad viene por Apache y el mod_python. En el ejemplo que hemos propuesto usamos el servidor web embebido en django, sin embargo este servidor solo vale para entornos de desarrollo, a la hora de cambiar a produccion usaremos Apache.


Frameworks de desarrollo rápido de aplicaciones

junio 9, 2009

En los últimos años ha habido un crecimiento de frameworks basados en diversos lenguajes para el desarrollo rápido de aplicaciones, el objetivo de estos frameworks es eliminar las repetitivas tareas que normalmente hay que realizar a la hora de desarrollas aplicaciones ya sean web o de escritorio.

El primero de estos frameworks fué Ruby On Rails , que ha tenido un éxito bastante grande en los últimos años, prueba de este éxito es la salida de otros con filosofías muy similares, como por ejemplo Grails para Groovy, MonoRail para ASP.NET o el objetivo de nuestra entrada Django para Python.

Estos frameworks se centran en varios puntos concretos, uno de ellos es la persistencia de los objetos “entidad” y los métodos de gestión de dichos objetos, con el uso de estas APIs vamos a simplificar de forma bastante importante todo el código que necesitamos para gestionar este aspecto. Otro de los puntos es facilitar la creación de paginas web para la gestión de lo que se suele conocer como backoffice. Normalmente muchos de estos frameworks se asocian al mundo web, pero esto no es del todo así, si bien es cierto que RoR es un conjunto de APIs cuyo objetivo es la web, si nuestra aplicación no esta dirigida a este entorno, podemos usar las APIs de RoR para la gestión de clases de entidad y usarlas, por ejemplo, en una aplicación de escritorio.

Uno de los pilares básicos de RoR es lo que se conoce como CoC, es decir, Convention Over Configuration. El principio básico de estas siglas es tratar de eliminar lo máximo posible los ficheros y parámetros de configuración mediante el seguimiento de unos estándares a la hora de codificar la aplicación. Así por ejemplo si en nuestra clase de entidad llamamos a nuestras variables de la misma manera que se llaman las columnas en la base de datos, el framework se encargará de gestionar el mapeo y nos generará métodos para acceder a dichas variables de forma automática. Esto, sin duda, tiene muchos beneficios ya que nos ahorra escribir mucho código, sin embargo también tiene su lado menos ventajoso, y es que si algo falla al estar “oculto” por el framework nos costará mas esfuerzo encontrar el error.

Otro de los aspectos mas relevantes de RoR es lo que se conoce como Scaffolding, esto es, la generación de todas las clases y métodos de gestión de nuestras entidades de forma automática. De esta manera, usando scaffolding RoR nos creará los métodos para crear, recuperar, actualizar y borrar nuestras entidades del almacenamiento persistente que usemos.

En futuras entradas del blog nos vamos a centrar en Django, cuyas características son similares a lo que hemos hablado anteriormente de Ruby On Rails.

Uno de los principales beneficios de usar Django es el lenguaje de programación. Python esta muy extendido globalmente y tiene una larga historia detrás de él, lo que le hace un lenguaje muy estable, rápido y con multitud de librerías para hacer casi cualquier cosa.


Anaconda Kickstart

junio 7, 2009

A la hora de instalar un sistema operativo hay muchas opciones que el usuario debe rellenar, en segun que casos esta interaccion con el usuario que esta instalando el sistema operativo puede ser un impedimiento. Un ejemplo de este caso viene cuando queremos instalar el mismo S.O. con la misma configuración en varias maquinas. De ahí que la instalación desatendida de un sistema operativo sea algo importante.

La herramienta que vamos a comentar en esta entrada se centra precisamente en este aspecto. Concretamente vamos a hablar de Kickstart, un metodo para instalar el S.O. basado en linux Fedora o su hermano Red hat enterprise Linux (RHEL).

Ademas de estos dos conocidos sistemas, conocí kickstart por la reciente distribución de linux para netbooks moblin, de la que hablaremos en otra entrada.

El propósito de kickstart es tener en un fichero los aspectos de configuración del sistema operativo que vamos a instalar, y automáticamente el programa de instalación, que en el caso de fedora o RHEL es anaconda, siguiendo los parámetros de dicho fichero instalará el sistema operativo sin realizar ninguna pregunta al usuario.

Los parametros de un fichero de kickstart son bastante detallados y van desde la configuración regional, pasando por la estructura de particiones del disco de destino o los paquetes que se van a instalar. Incluso podemos especificar una serie de acciones que se van a llevar a cabo una vez que el sistema este instalado, como por ejemplo podría ser el copiar desde un servidor remoto la configuracion por defecto de un escritorio como XFCE.