Visor de bases de datos SQLite con PyQt 4

Haciendo uso del módulo estándar sqlite3 y el paquete PyQt 4.

Vista previa

Descargas

Fuentes

sqlviewer.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
#       sqlviewer.py
#       
#       Copyright 2013 Recursos Python - www.recursospython.com
#       

import sys

from PyQt4.QtCore import QStringList, QString
from PyQt4.QtGui import (QAbstractItemView, QApplication, QFileDialog,
                         QMainWindow, QTabWidget)

from database import DataBase
from dbtablewidget import DBTableWidget


class Window(QMainWindow):
    
    def __init__(self, dbname):
        QMainWindow.__init__(self)
        
        # Establecer título y tamaño
        self.setWindowTitle("Visor de base de datos SQLite")
        self.resize(800, 450)
        
        self.tab_widget = QTabWidget(self)
        self.setCentralWidget(self.tab_widget)
        
        # Abrir la base de datos
        self.db = DataBase()
        self.db.open(dbname)
        
        # Añadir una pestaña por cada tabla
        for table in self.db.get_tables():
            table_name = table[1]
            table_info = self.db.get_table_info(table_name)
            table_widget = DBTableWidget(self.tab_widget)
            table_widget.setAlternatingRowColors(True)
            table_widget.setShowGrid(True)
            table_widget.setColumnCount(0)
            table_widget.setRowCount(0)
            table_widget.setHorizontalScrollMode(
                QAbstractItemView.ScrollPerPixel)
            
            string_list = QStringList()
            
            database_table_name = table_name
            database_table_column_count = len(table_info)
            database_table_columns = {}
            database_table_items = []
            
            table_widget.setColumnCount(database_table_column_count)
            
            # Obtener y añadir columnas
            for column in table_info:
                string_list.append(QString(column[1]))
                database_table_columns[column[0]] = column[1]
            
            table_widget.setHorizontalHeaderLabels(string_list)
            
            # Obtener y añadir filas
            for items in self.db.get_table_items(table_name):
                table_widget.add_row(items)
                database_table_items.append([item for item in items])
            
            self.tab_widget.addTab(table_widget, table_name)
        
        self.db.close()


if __name__ == "__main__":
    app = QApplication([])
    
    # Tomar un archivo de la línea de comandos o abrir el explorador
    if len(sys.argv) > 1:
        filename = sys.argv[1]
    else:
        filename = QFileDialog.getOpenFileName(
            None, filter="Archivos SQLite (*.db *.sqlite *.sqlite3);;"
                         "Todos los archivos (*.*)")
    
    window = Window(filename if isinstance(filename, basestring) else
                    unicode(filename))
    window.show()
    sys.exit(app.exec_())

database.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
#       database.py
#       
#       Copyright 2013 Recursos Python - www.recursospython.com
#       

import sqlite3


class DataBase:
    
    def __init__(self):
        self.conn = None
        self.cursor = None
    
    def open(self, dbname):
        """Abrir conexión y establecer un cursor"""
        self.conn = sqlite3.connect(dbname)
        self.cursor = self.conn.cursor()
    
    def get_tables(self):
        """Retorna las tablas"""
        q = self.cursor.execute("SELECT * FROM sqlite_master WHERE "
                                "type='table'")
        return q.fetchall()
    
    def get_table_info(self, table):
        """Retorna las columnas"""
        q = self.cursor.execute("PRAGMA table_info(%s)" % table)
        return q.fetchall()
    
    def get_table_items(self, table):
        """Retorna las filas"""
        q = self.cursor.execute("SELECT * FROM " + table)
        
        return q.fetchall()
    
    def commit(self):
        """Guardar cambios"""
        self.conn.commit()
    
    def close(self):
        self.cursor.close()
        self.conn.close()

dbtablewidget.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
#       dbtablewidget.py
#       
#       Copyright 2013 Recursos Python - www.recursospython.com
#       

from PyQt4.QtCore import QString
from PyQt4.QtGui import QTableWidgetItem, QTableWidget


class DBTableWidget(QTableWidget):
    
    def add_row(self, items):
        """Añadir una fila a la tabla con sus respectivos items"""
        row_count = self.rowCount()
        self.setRowCount(row_count + 1)
        self.setRowHeight(row_count, 20)
        
        for index, item in enumerate(items):
            content = QString(unicode(item) if item is not None else "")
            self.setItem(row_count, index, QTableWidgetItem(content))

Versión

Python 2.7

Curso online 👨‍💻

¡Ya lanzamos el curso oficial de Recursos Python en Udemy! Un curso moderno para aprender Python desde cero con programación orientada a objetos, SQL y tkinter en 2024.

Consultoría 💡

Ofrecemos servicios profesionales de desarrollo y capacitación en Python a personas y empresas. Consultanos por tu proyecto.

2 comentarios.

  1. Buenas tardes, una valiosa información. Tengo una duda, cuando uso la sentencia ‘self.setItem(row_count, index, QTableWidgetItem(content))’, del módulo dbtablewidget.py, al cerrar la ventana me sale el mensaje de error: ‘python.exe dejó de funcionar…’ . Alguna sugerencia?

    • Recursos Python says:

      Hola, gracias por el comentario y lamento la tardanza de la respuesta. No he podido reproducir el error, ¿estás usando el código que se provee en las descargas o has llamando el módulo dbtablewidget desde un proyecto nuevo?

Deja una respuesta