Jugando con SQLAlchemy

written by uve 1 November 2010

Hace ya tiempo que escuché hablar de SQLAlchemy. Para quién no lo conozca, es un toolkit para SQL y posee un ORM. SQLAlchemy es una capa abstracción para la construcción y manipulación de expresiones SQL, pero nos permite mapear de una forma sencilla a objetos Python y funcionar como un ORM.

Lo primero que vamos a ver es como crear unas sencillas tablas (de un experimento con el que ando liado). Empezamos por decidir el engine a utilizar: SQLite.

from sqlalchemy import create_engine
engine = create_engine('sqlite:///chunks.db', echo=True)

Ahora vamos a definir las tablas sobre el catálogo MetaData, el cuál enlazaremos con el engine:

from sqlalchemy import MetaData, Column, Table, ForeignKey
from sqlalchemy import Integer, String, Text, DateTime

metadata = MetaData(bind=engine)

activities_table = Table(
    'activities', metadata,
    Column('id', Integer, primary_key=True),
    Column('name', String(80)),
    Column('description', Text, nullable=True),
    Column('schedule', DateTime, nullable=True),
)

chunks_table = Table(
    'chunks', metadata,
    Column('id', Integer, primary_key=True),
    Column('description', Text),
    Column('activity_id', None, ForeignKey('activities.id'), nullable=True),
)

Una vez definidas las tablas, podemos crearlas de la siguiente forma:

# create tables in database
metadata.create_all()

Pero, ¿cómo trabajar esto desde Python? Hay varias formas para ello. Vamos a mapear las tablas en objetos:

class Activity(object):
    def __init__(self, name, description, schedule):
        self.name = name
        self.description = description
        self.schedule = schedule

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

class Chunk(object):
    def __init__(self, description, activity_id):
        self.description = description
        self.activity_id = activity_id

    def __repr__(self):
        return "<Chunk '%s'>" % self.description

Una vez listos nuestros objetos, toca mapear de verdad:

from sqlalchemy.orm import mapper
mapper(Activity, activities_table)
mapper(Chunk, chunks_table)

Tags

La teoría es cuando crees saber algo, pero no funciona.
La práctica es cuando algo funciona, pero no sabes por qué.
Los programadores combinan la teoría y la práctica:
Nada funciona y no saben por qué.