Programando en Linux #1: Sqlalchemy y Elixir

En una nueva serie de posts relacionados a la programación en Linux y en desbancar el mito de que programar en Linux es muy obsoleto, hoy les presento unas herramientas que tuve el placer de probar el fin de semana. se trata de sqlalchemy con elixir.

Despues de casi dos años programando enteramente cosas web con frameworks como django y otros. He llegado a apreciar los ORM con todo y sus limitaciones. hoy les presento a sqlalchemy y elixir para el manejo de sus datos. Los ejemplos reflejados se orientan a python.

Sqlalchemy es un set de herramientas SQL y un ORM (Object Relational Mapper), esta diseñado para bases de datos robustas y ofrece buen desempeño en bases de datos de alta disponibilidad.

Elixir es una capa declarativa sobre Sqlalchemy que trae el uso de clases python directamente a las tablas de entidad relación como esta descrito en el esquema de diseño Active Record.

La instalación es muy sencilla:

para los que usamos easy_install de python:

sudo easy_install elixir

Una vez instaldo Elixir ya tenemos instalado Sqlalchemy, solo nos queda hacer nuestras clases en python para describir nuestros alamcenes de datos🙂. Para este ejemplo usaremos una base de datos en sqlite, Para mas ejemplos pueden ver  el tutorial de Elixir . En un archivo models.py agregamos nuestras clases.

from elixir import *

metadata.bind = "sqlite:///peliculas.sqlite"
metadata.bind.echo = True

class Pelicula(Entity):
    titulo = Field(Unicode(30))
    lanzada = Field(Integer)
    descripcion = Field(UnicodeText)

    def __repr__(self):
        return '<Pelicula "%s" (%d)>' % (self.titulo, self.lanzada

class Director(Entity):
    nombre = Field(Unicode(60))
    peliculas = OneToMany('Pelicula')         

    def __repr__(self):
        return '<Director "%s">' % self.name


Con usar  “metadata.bind.echo = True” estamos indicando que nos de una salida bastante vocal sobre las transacciones con la base de datos en SQL. si no queremos eso solo cambiamos la variable “True” a “False”.

Luego probamos la interacción en un Shell de Python:

Importamos nuestros modelos

>>> from models import *

Luego de esto creamos nuestras clases python según los modelos

>>> setup_all()
 

Luego creamos las tablas a base de datos según  los modelos definidos en models.py:

>>> create_all()
 

Luego nos disponemos a trabajar con los datos:

Agregamos unas peliculas
>>> oriana = Pelicula(title=u"Oriana", lanzada=1985)
<Pelicula "Oriana" (1985)>
>>> wotop = Pelicula(title=u"Women on Top", lanzada=2000)
<Pelicula "Women on Top" (2000)>

Agregamos una directora
>>> ftorres = Director(nombre=u"Fina Torres")
Asignando un director a la pelicula
>>> oriana.director = ftorres
Asignamos peliculas a un Director
>>> ftorres.peliculas.append(wotop)
listamos las peliculas de un Director
>>> ftorres.peliculas
[<Pelicula "Oriana" (1985)>]
[<Pelicula "Women on Top" (2000)>]
Buscamos películas lanzadas después del 1990
>>> Pelicula.query.filter(Pelicula.lanzada > 1990).all()
[<Pelicula "Women on Top" (2000)>]

Hay mas ejemplos de pedidos con el ORM en el tutorial de Elixir, espero disfruten trabajar con Elixir y Sqlalchemy.


Una vez instaldo Elixir ya tenemos instalado Sqlalchemy, solo nos queda hacer nuestras clases en python para describir nuestros alamcenes de datos🙂. Para ete ejemplo usaremos el motor de sqlite


About effiejayx

Ubuntu enthusiast... need I say more? :)
This entry was posted in Español, planetalinux, tur-linux. Bookmark the permalink.

2 Responses to Programando en Linux #1: Sqlalchemy y Elixir

  1. Zeitan says:

    Esta bueno el ejemplo, asumo que puede trabajr con DBMS tipo PGSQL o MySQL, no?
    Este par de tools son los que usa python-camelot, no?
    A pesar del tema de ORM y su escalabilidad el usarlos es un placer y hacer que la capa de persistencia no sea parte de neustra codificación es algo priceless, creo que el el tema de ORM obliga a realmente implemetar esquemas ACID como debería, igualmente en esquemas CRUD el Recovery es el tema que siempre veo mas preocupante porel consumo de recursos, igualmente habria que ver como cada implementación lo resuelve.
    Habria que probarlo y ver como anda.

  2. jose ernesto says:

    Hola, estoy creando un componente genérico usando sqlalchemy y a la hora de mappear la tabla no se los nombres que tendrán las columnas de la BD, me gustaria saber si existe alguna forma de acceder a las tablas sin saber su nombre, solo se en que orden fueron insertadas, gracias por adelantado

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s