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
dbtablewidgetdesde un proyecto nuevo?