Skip to content

Nuestra primera aplicación en python y qt4 [3]. Accediendo a bases de datos con SQLite.

noviembre 26, 2011

Tras haber creado la interfaz de nuestro programa, ahora vamos a empezar a escribir algo de código.
Lo primero que vamos a implementar es la capacidad de conectarnos con una base de datos.
Como vamos a utilizar bases de datos SQLite, lo primero que tenemos que hacer será importar la herramienta necesaria a nuestro programa:

import sqlite3

Cuando comencemos el programa, queremos que cargue la base de datos con todas las operaciones anteriormente guardadas. Si no tenemos ninguna base de datos creada, crearemos una nueva y le añadiremos sus correspondientes campos (Tipo, Lugar, Fecha…).
Tras ello, leeremos la base de datos y la copiaremos en nuestra tabla.

Visto en forma esquemática:


Vamos a traducirlo a código real:
Antes que nada, definimos la función, que irá dentro de la clase MyForm:

def IniciarBase(self):

Esta es la manera de crear funciones en python: def +”Nombre de la función”+ (Argumentos)+ “:”. No queremos ningún argumento de entrada a nuestra función, por ello solo escribimos self.
A partir de aquí, la indentación debe ser superior para indicar que estamos dentro de la función. Puedes utilizar el tabulador.
Ahora hay que leer un fichero y ver si existe la base de datos. De momento nuestra aplicación no tiene capacidad para abrir o guardar varias bases de datos, por lo que suponemos que el archivo de base de datos esta en la misma carpeta que el programa:

import os.path
camino = os.path.abspath('basehucha.db')#La variable camino es la ruta "absoluta" del archivo "basehucha.db"
print camino
print os.path.isfile(camino)

Las dos ultimas líneas no son necesarias, simplemente imprimirán en la terminal la variable camino, y si existe o no el archivo. Esta función (print) es muy útil, ya que nos ayuda en todo momento a ver si vamos bien, o si falla algo nos permite estudiar donde esta el error. Si no la queréis utilizar, podéis borrar las lineas o comentarlas poniendo “#” delante para que no se ejecuten.

Ya tenemos la función que nos indica si existe o no un archivo (os.path.isfile()), por lo que vamos a actuar en función de su salida:

if not os.path.isfile(camino): #si no existe el archivo...
self.conexion = sqlite3.connect('basehucha.db') #Creamos la base y nos conectamos a ella
print 'Base creada'
self.cursor = conexion.cursor() #Creamos un cursor para realizar operaciones en la base de datos
self.cursor.execute("CREATE TABLE Operaciones (Id INTEGER PRIMARY KEY, Tipo TEXT, Lugar TEXT, Comentarios TEXT, Fecha TEXT, Cantidad INT)") #Creamos una tabla "Operaciones" con varias columnas dentro de la db
print 'Tabla creada'
self.conexion.commit() #Enviamos lo que hemos hecho. Si no ponemos esta función, no se creara la tabla.
else:
self.conexion = sqlite3.connect('basehucha.db') #Como ya existe la db, nos conectamos a ella
print 'Base conectada'
self.cursor = self.conexion.cursor()

La primera vez que utilicemos el programa se creara una db nueva, pero el resto de las veces ya habrá una con datos para usar. Por ello, creamos una función que lea la tabla en la db y lo escriba en nuestro Table Widget:

def actualizarBase(self):
  #Cargamos la base de datos y la colocamos en la tabla
  self.cursor.execute("SELECT * FROM Operaciones") #Seleccionamos todo en la tabla
  filas = self.cursor.fetchall()#Lo copiamos con el cursor en una lista llamada filas
  self.numerodefilas=len(filas)
  self.ui.tableWidget.setRowCount(self.numerodefilas) #La tabla debe tener el mismo numero de filas que la db
  #print filas[0] #Debug
  for j in range(self.numerodefilas): #Por cada fila....
    fila = filas[j] #filas tiene la forma: filas=[fila1,fila2,fila3....]
    for i in range(1,len(fila)): #Por cada elemento de la fila...
      elemento = fila[i]
      print 'elemento= '+ str(elemento)
      #print i
      elemento = str(elemento) #Lo convertimos en una cadena
      if elemento == 'None' : elemento = ' '
      item=None
      item = QtGui.QTableWidgetItem()
      item.setText(QtGui.QApplication.translate("Hucha", str(elemento), None, QtGui.QApplication.UnicodeUTF8))
      self.ui.tableWidget.setItem(j,i-1,item) #Copiamos el elemento de la db en la tabla.

Para que cada vez que abramos la aplicación se utilicen estas funciones, hemos de llamarlas dentro de la función __init__() de nuestra clase MyForm. Para ello, nada más fácil que:

self.iniciarbasededatos()
self.actualizarBase()

Todo ello queda de esta manera:

# -*- coding: utf-8 -*-

import sys
from PyQt4 import QtCore, QtGui, Qt
from hucha_ui import Ui_Hucha
import sqlite3

class MyForm(QtGui.QMainWindow):
  def __init__(self, parent=None):
    locale=unicode(QtCore.QLocale.system().name())
    QtGui.QWidget.__init__(self, parent)
    self.ui = Ui_Hucha()
    self.ui.setupUi(self)
    self.IniciarBase()
    self.ActualizarBase()

  def IniciarBase(self):
    import os.path
    camino = os.path.abspath('basehucha_tutorial.db')
    print camino
    print os.path.isfile(camino)
    #Si la base de datos existe, la cargamos; si no, la creamos
    if not os.path.isfile(camino):
      self.conexion = sqlite3.connect('basehucha_tutorial.db')
      print 'Base creada'
      self.cursor = self.conexion.cursor()
      self.cursor.execute("CREATE TABLE Operaciones (Id INTEGER PRIMARY KEY, Tipo TEXT, Lugar TEXT, Comentarios TEXT,       Fecha TEXT, Cantidad INT)")
      print 'Tabla creada'
      self.conexion.commit()
    else:
      self.conexion = sqlite3.connect('basehucha_tutorial.db')
      print 'Base conectada'
      self.cursor = self.conexion.cursor()

  def ActualizarBase(self):
  #Cargamos la base de datos y la colocamos en la tabla

    self.cursor.execute("SELECT * FROM Operaciones")
    filas = self.cursor.fetchall()
    self.numerodefilas=len(filas)
    self.ui.tableWidget.setRowCount(self.numerodefilas)
    #print filas[0]

    for j in range(self.numerodefilas):

      fila = filas[j]
      for i in range(1,len(fila)):
        elemento = fila[i]
        print 'elemento= '+ str(elemento)
        #print i
        elemento = str(elemento)
        if elemento == 'None' : elemento = ' '
        item=None
        item = QtGui.QTableWidgetItem()
        item.setText(QtGui.QApplication.translate("Hucha", str(elemento), None, QtGui.QApplication.UnicodeUTF8))
        self.ui.tableWidget.setItem(j,i-1,item)

if __name__ == "__main__":
  app = QtGui.QApplication(sys.argv)
  myapp = MyForm()
  myapp.show()
  sys.exit(app.exec_())

¡Espero que os funcione!
¡Saludos!

Anuncios
Dejar un comentario

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: