Este es uno de los capítulos del tutorial Hacer una aplicación gráfica para Linux. Encontrarás los enlaces a todos los de capítulos, al final de este artículo.
Continuando con la serie de artículos para hacer Equival en Python, y antes de ponernos a diseñar la interfaz gráfica con Glade, es necesario tener claro como vamos a almacenar los datos. En principio, y como hice con Equival, los voy a guardar en una base de datos. En este caso la base de datos será de Sqlite. La razón de la elección radica en que esta base de datos está soportada en Linux, y en el caso de Ubuntu, se puede instalar muy fácilmente desde los repositorios. Además, está el tema del Wrapper. Y aquí es donde está el meollo de la cuestión.
Hace unos meses encontré un wrapper increible para Python y que tenía soporte para las principales bases de datos, MySQL, PostgreSQL, Firebird, SQLite y otras.
El Wrapper en cuestión es SQLObject, y es increiblemente sencillo de utilizar. Por ejemplo, en nuestro caso, para definir nuestras dos principales clases «unidad» y «magnitud» simplemente tenemos que implementar el siguietne código:
class Magnitud(sqlobject.SQLObject): nombre = sqlobject.StringCol(unique=True) nota = sqlobject.StringCol() unidades = MultipleJoin(`Unidad`) class Unidad(sqlobject.SQLObject): nombre = sqlobject.StringCol(unique=True) simbolo = sqlobject.StringCol() factor = sqlobject.FloatCol() formula = sqlobject.StringCol() derivada = sqlobject.BoolCol() nota = sqlobject.StringCol() magnitud = ForeignKey(`Magnitud`,cascade=True)
con estas pocas líneas ya tenemos nuestro wrapper, para envolver a Unidad y Magnitud.Hay que destacar que aquí ya tenemos relacionadas ambas tablas, utilizando:
magnitud = ForeignKey(`Magnitud`,cascade=True)
Pero no queda ahí la cosa, se puede definir directamente las tablas para que las implemente en la base de datos:
db_filename = os.path.abspath(`equival.sqlite`) if os.path.exists(db_filename): os.unlink(db_filename) connection_string = `sqlite:`+db_filename connection = connectionForURI(connection_string) sqlhub.processConnection = connection # Con estas dos líneas creamos las tablas Magnitud.createTable() Unidad.createTable()
Esto directamente nos genera las tablas sql en la base de datos «equival.sqlite»
CREATE TABLE magnitud ( id INTEGER PRIMARY KEY, nombre TEXT UNIQUE, nota TEXT ) CREATE TABLE unidad ( id INTEGER PRIMARY KEY, nombre TEXT UNIQUE, simbolo TEXT, factor FLOAT, formula TEXT, derivada BOOLEAN, nota TEXT, magnitud_id INT CONSTRAINT magnitud_id_exists REFERENCES magnitud(id) ON DELETE CASCADE )
Y por último para listar todas las unidades y magnitudes:
magnitudes=Magnitud.select(Magnitud.q.id>0) for magnitud in magnitudes: print(magnitud.nombre) unidades=Unidad.select(Unidad.q.id>0) for unidad in unidades: print(unidad.nombre)
Sencillo ¿no? Ya tenemos el primer pasa hacia EquivalPy