PyQT Acceso a Datos SQLite

PyQT 5 soporta la conexión con varios servidores SQL como: SQLite, MySQL, ODBC, y PostgreSQL, antes de poder conectarnos a cualquiera de estos servidores debemos instalar el driver correspondiente, el driver SQLite se instala por defecto, por lo que este será el servidor que utilizaremos en este primer tutorial, más adelante veremos los demás servidores de datos.

Conexión a SQLite

Para establecer la conexión a un servidor de bases de datos usaremos el método estático QSqlDatabase.addDatabase(‘QSQLITE’) indicado el servidor que utilizaremos, disponemos de las siguientes opciones: QSQLITE, QMYSQL, QMYSQL3, QODBC, QODBC3, QPSQL, y QPSQL7, utilizamos el método open() para establecer la conexión y verificar la misma.

def db_connect(filename, server):
    db = QSqlDatabase.addDatabase(server)
    db.setDatabaseName(filename)
    if not db.open():
        QMessageBox.critical(None, "Cannot open database",
                "Unable to establish a database connection.\n"
                "This example needs SQLite support. Please read the Qt SQL "
                "driver documentation for information how to build it.\n\n"
                "Click Cancel to exit.", QMessageBox.Cancel)
        return False
    return True

La variable server indica el servidor, para nosotros ‘QSQLITE’, recordemos que si deseamos utilizar otro debemos instalar el driver correspondiente, filename es el nombre del archivo donde SQLite almacenará la base de datos, al crearlo por primera vez este archivo estará vacío.

Si deseamos conectarnos a otro servidor de datos como MySQL por ejemplo, debemos indicar nombre de usuario, contraseña, puerto, etc., en ese caso disponemos de los correspondientes métodos:

db = QSqlDatabase.addDatabase('QMYSQL')
db.setHostName('localhost')
db.setPort(3306)
db.setUserName('root')
db.setPassword('159159')
db.setDatabaseName('sakila')

Recordamos que el servidor debe estar disponible y recibiendo conexiones en el puerto indicado, además debemos tener el complemento Python MySQL instalado.

Crear Tablas e Insertar Datos

En este punto lo siguiente que debemos hacer es crear las tablas en nuestra base de datos, para nuestros propósitos crearemos una tabla llamada person, esta tabla tendrá tres columnas, la primera de tipo entero para la clave primaria, y dos mas para almacenar nombre y apellido de la persona.

def db_create():
    # crear la tabla person
    query = QSqlQuery()
    query.exec_("create table person(id int primary key, "
                "firstname varchar(20), lastname varchar(20))")

    # insertar datos en la tabla person
    query.exec_("insert into person values(101, 'Danny', 'Young')")
    query.exec_("insert into person values(102, 'Christine', 'Holand')")
    query.exec_("insert into person values(103, 'Lars', 'Gordon')")
    query.exec_("insert into person values(104, 'Roberto', 'Robitaille')")
    query.exec_("insert into person values(105, 'Maria', 'Papadopoulos')")

Utilizando un objeto QSqlQuery podemos enviar comandos SQL a la base de datos, lo hacemos a través del método query.exec_(‘…’) 

La primera consulta es la encargado de crear la tabla llamada person, lo hacemos usando el comando create table, el segundo grupo de consultas utiliza en comando insert para agregar un conjunto de datos a la tabla que acabamos de crear.

Consultar Datos

Usaremos en control QTableWidget, que ya hemos visto en tutoriales anteriores, para mostrar los datos que contiene nuestra tabla person, nuevamente usaremos QSqlQuery para ejecutar la consulta select, los datos obtenidos los enviaremos al widget QTableWidget.

sqlite pyqt

Al presionar el botón “Cargar Datos” se ejecuta el siguiente código:

def cargarDatos(self, event):
    index = 0
    query = QSqlQuery()
    query.exec_("select * from person")

    while query.next():
        ids = query.value(0)
        nombre = query.value(1)
        apellido = query.value(2)

        self.table.setItem(index, 0, QTableWidgetItem(str(ids)))
        self.table.setItem(index, 1, QTableWidgetItem(nombre))
        self.table.setItem(index, 2, QTableWidgetItem(apellido))

        index += 1

Utilizamos query.next() para avanzar a la siguiente fila, esto lo haremos siempre que haya una fila disponible, para obtener el contenido de la columna usamos query.value(columna) donde columna es el índice base cero de la columna de deseamos obtener.

Eliminar Datos

Antes de eliminar una fila de la base de datos debemos verificar si el usuario ha seleccionado la misma, de ser así, obtenemos el ID de la fila seleccionada y ejecutamos la consulta delete correspondiente, para finalizar actualizamos los datos mostrados en el QTableWidget.

def eliminarDatos(self, event):
    selected = self.table.currentIndex()
    if not selected.isValid() or len(self.table.selectedItems()) < 1:
        return

    ids = self.table.selectedItems()[0]
    query = QSqlQuery()
    query.exec_("delete from person where id = " + ids.text())

    self.table.removeRow(selected.row())
    self.table.setCurrentIndex(QModelIndex())

self.table.currentIndex() nos devuelve la fila seleccionada por el usuario, la misma se selecciona al hacer clic sobre ella, self.table.removeRow(…) nos sirve para eliminar la fila seleccionada del QTableWidget, eliminamos la fila de la base de datos con la consulta delete ejecutada por el objeto QSqlQuery.

Agregar Datos

Para agregar una fila usamos la consulta SQL insert, tomamos los datos de la cajas de texto que crearemos para ingresar los datos de cada una de las columnas, debemos recordar que el identificador debe ser de tipo entero y que la longitud máxima del nombre y apellido es de 20 caracteres.

def insertarDatos(self, event):
    ids = int(self.txtID.text())
    nombre = self.txtName.text()
    apellido = self.txtApellido.text()

    query = QSqlQuery()
    query.exec_("insert into person values({0}, '{1}', '{2}')".format(ids, nombre, apellido))

Para observar los nuevos datos debemos recargar los datos.

agregar eliminar datos sqlite

De momento llegaremos hasta aquí, la operación modificar datos les queda de tarea, si comprendieron lo que acabamos de hacer su programación no será difícil.

Si deseas reestablecer la base de datos solo debes borrar el archivo datafile, este programa verifica la existencia de este archivo, si no existe lo crea y agrega la tabla y los datos iniciales.

Proyecto en GitHub: PyQT Acceso a SQLite

Comentarios

Entradas populares de este blog

Conectar SQL Server con Java

Entrenar OpenCV en Detección de Objetos

Acceso a la webcam con OpenCV

JavaFx 8 Administrar ventanas

Analizador Léxico