domingo, 16 de marzo de 2014

Python. MVC y MySQL ( PyGtk )




En esta tercera entrega de nuestro aprendizaje de Python con PyGtk, vamos a ver como haciendo nuestras Querys de MySQL se verán reflejadas en nuestra vista.

Antes de continuar, hacer un git pull del proyecto ubicado en github, para ver los nuevos cambios.

Las mejoras que tenemos en esta revisión, son;

  • Usamos una statusbar para dar información y mostrar también errores de MySQL
  • Crearemos a través de un TextView, un modelo de datos ListStore y columnas dinámicamente.
  • Controlamos la salida de la aplicación, preguntado si queremos salir.
  • Pulsando la tecla F5 en la ventana, lanzará la consulta que tengamos en ese momento en el TextView
  • Los eventos saltan ahora a la propia clase, abandonando la clase Handler(), por ser más sencillo la gestión. De todas maneras no la quito del código, para que se vea que podemos elegir el sistema que más nos guste.
Casi todo el trabajo se realiza en el método setQuery(), y es lo que veremos a continuación.

Obtener la sentencia que hemos escrito en el textview;

        textbuffer = self.textview_sql.get_buffer()
        self.cSql = textbuffer.get_text(*textbuffer.get_bounds())


Aquí de lo que se trata es de eliminar las columnas de la antigua sentencia ejecutada y limpiar el modelo de datos asociado a la vista;


        # remove columns the old view
        nOld_Fields = self.getTotalColumns()
        if nOld_Fields != 0:
            for column in self.view_lista.get_columns():
                self.view_lista.remove_column( column )


        #Clear model data of view
        oModel = self.view_lista.get_model()
        if oModel != None:
            oModel.clear()
        self.view_lista.set_model()

Ahora, ejecutamos la sentencia en MySQL, también podríamos adaptarlo fácilmente a otro motor, como Sqlite o PostGres, y en caso de error, lo mostramos en la statusbar;

        #Execute Sql
        cursor = self.db.cursor()
        try:
            cursor.execute(self.cSql)
            result = cursor.fetchall()
        except MySQLdb.Error, e:
            self.status_setText( "Error %d: %s" % (e.args[0], e.args[1]) )
            return

Ahora lo que vamos a realizar es muy simple, obtenemos la cantidad de campos y sus nombres, para crear las columnas correspondientes, que lo logramos a través del método AddListColumn()

        num_fields = len(cursor.description)
        field_names = [i[0] for i in cursor.description] # Name of fields

        #Create Columns from names fields
        i = 0
        for nombre in field_names:
            self.AddListColumn(nombre, i)
            i = i + 1

Una vez que tenemos nuestras columnas creadas, lo que nos resta es crear el modelo de datos y rellenarlo con nuestra Query y asignarlo a la vista;

        #Create model dinamic of types str for view
        ListStore = gtk.ListStore(*([str] * num_fields))
        for value in result:
            ListStore.append(value)
        self.view_lista.set_model(ListStore)



Pues esto es todo en esta tercera entrega, ahora podemos empezar a ver resultados visibles ;-)

Para la próxima, usaré un TreeStore, para montar las estructuras de nuestras tablas que tengamos en la base de datos, además, incorporaremos alguna que otra imagen en la vista, para que quede más chulo.

Dejo unas imágenes con los resultados del código a ver que os parecen.









No hay comentarios:

Publicar un comentario

Android y Git. Disponer del hash automáticamente.

Una de las cosas a las que estoy acostumbrado, es tener siempre en mi código, el hash/tag/versión del control de versiones que estoy usan...