Haciendo uso del módulo estándar sqlite3 y el paquete PyQt 4.
Descargas
- Código de fuente (requiere Python 2.7 y PyQt 4)
- Archivo ejecutable (Windows)
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.
Angel says:
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?