Si hay algo que considero tedioso son las migraciones de datos cuando hay cambios estructurales de una BD a otra. Normalmente me hacía un script en Python, y con python-mysql me hacía unas cuantas consultas SQL, sacaba los datos y me peleaba con la correspondiente lista de datos producto de la consulta.

¡Nunca más! Desde que descubrí SQLAlchemy y SqlSoup encontré una manera mucho más bonita y agradable de trabajar con los datos, con clases. Esto no crea nada nuevo... pero si os digo que las clases las crea automáticamente SqlAlchemy a partir de los metadatos de las tablas y que no tenemos que definir ni una sola clase para disfrutar de toda la potencia y facilidad de los objetos, la cosa cambia, y mucho.


import sqlalchemy
from sqlalchemy.ext.sqlsoup import SqlSoup
from sqlalchemy import MetaData

def main():
    engine = sqlalchemy.create_engine('mysql://user:[email protected]/bd?charset=utf8')
    db = SqlSoup(MetaData(engine))

Obviando las líneas de importación, simplemente creamos una conexión mySQL a la BD en cuestión y le pasamos a una instancia de SqlSoup los metadatos de éstos. Posteriormente, para acceder a los datos sólo hay que consultar la variable db y el nombre de la tabla de la siguiente manera:


    project_list = db.project.limit(30)
    
    for project in project_list:
        print project.name

        participant_list = db.participant.filter_by(project_id=project.id)

        for participant in participant_list:
            print participant.name

En db.project tomaríamos los 30 primeros datos de la tabla project. Posteriormente iteramos sobre éstos y realizamos una consulta sobre la tabla participant, la cual está relacionada con la tabla project por el project_id. Conseguimos los datos de participant e iteramos por ellos.

Como véis para acceder a un campo de la tabla basta con hacer un project.name (nombre_tabla.elemento), así de fácil.

Si queréis saber más, los enlaces de arriba os serán de ayuda.