16 diciembre 2012

Acciones básicas de Python manejando una base de datos SQLite3


Buenas tardes!

Después de día y medio programando he llegado a terminar esta muestra sencilla muestra de cómo interactuar con Python en una base de datos SQLite3

Para esto cree la clase AccionesSQL. Dentro de ella, la primera linea importa la librería que necesitaremos para funcionar : import sqlite3

El segundo trozo de código relevante está en el constructor de la clase, función __init__(self): Aquí se crea un objeto conexión que se conectara con la base de dato que queramos. Después se crea   un cursor, que es propio de la conexión creada.

La función insertarTelefonoBD es el tercer trozo importante. Aquí se hace una inserción. Para esto usamos una sentencia SQL ejecutada sobre el cursor. Y al punto se realiza un commit porque sino  la inserción no se  hace efectiva.

Poco más abajo tenemos la función  modificarTelefonoBD. Aquí, se desarrolla una actualización de un campo existente y salvo la sentencia SQL todo es igual a caso anterior. Lo mismo pasa con la función suprimirTelefonoBD. Mas esta, suprime.

La penúltima función es listarTelefonosBD y en ella se cargan y muestran todos los registros de la tabla indicada. Se puede añadir una clausula WHERE y también una ORDER BY, y así acotaríamos u ordenaríamos.

La función buscarTelefonosBDxNumero busca teléfonos dependiendo de la opción indicada. Me apeteció hacer 4 tipos de búsqueda: coincidencia total, coincidencia parcial, que empezase por un valor determinado o que acabase según un valor. Luego, para finalizar recorrí el cursor donde se guardaron los registros resultantes, y mostré los datos guardados.

A continuación, el código integro:

import sqlite3 
import sys
class AccionesSQL:
    def __init__(self): 
        self.conexion=sqlite3.connect('listinTelefonico.sqlite')
        self.cursor=self.conexion.cursor()

    def insertarTelefonoBD(self,nombre1,numero1, notas1):
        SQL='insert into Telefonos (Nombre, NumeroTelefono, Notas) values("'+nombre1+'","'+numero1+'","'+notas1+'")'
        self.cursor.execute(SQL)
        self.conexion.commit()
        print 'se ha insertado exitosamente'

    def modificarTelefonoBD(self,id1, nombre1, numero1, notas1):
        SQL='update Telefonos set Nombre="'+ nombre1 + '",NumeroTelefono="' + numero1 + '", Notas="'+notas1 +'" where id='+str(id1)
        self.cursor.execute(SQL)
        self.conexion.commit()
        print 'modificacion exitosa'

    def suprimirTelefonoBD(self, id):
        SQL='delete from Telefonos where ID='+str(id)
        self.cursor.execute(SQL)
        self.conexion.commit()

    def listarTelefonosBD (self):
        SQL = 'select * from Telefonos order by nombre '
        self.cursor.execute(SQL)
        for row in self.cursor:
            print "%s --> %s --> %s" % (row[0],row[1],row[2])

    def buscarTelefonosBDxNumero(self, numero, opcion):
        SQL='HOLA'
        if opcion==1:
            print 'Numeros que terminan por ' + numero
            SQL = 'select * from Telefonos where NumeroTelefono like "%'+numero +'"'
            self.cursor.execute(SQL)
        elif opcion==2:
              print 'Numeros que contienen el numero ' + numero
              SQL = 'select * from Telefonos where NumeroTelefono like "%'+numero +'%"'
              self.cursor.execute(SQL)
        elif opcion==3:
            print 'Numeros que empieza exactamente son el numero ' + numero
            SQL = 'select * from Telefonos where NumeroTelefono = "'+numero +'"'
            self.cursor.execute(SQL)
        elif opcion==4:
            print 'Numeros que empizan por ' + numero
            SQL = 'select * from Telefonos where NumeroTelefono like "'+numero + '%"'
            self.cursor.execute(SQL)
        for row in self.cursor:
            print "%s --> %s --> %s" % (row[0],row[1],row[2])

Esta parrafada que se gestiona en diferentes funciones la llamo desde otra clase según procede. Se llama Telefonos y su código es este:


from AccionesSQL import AccionesSQL
        
class Telefonos:

    def __init__(self,nmb1,tlf1,nts1):
        self.Nombre = nmb1
        self.NumTelefono = tlf1
        self.Notas = nts1
        self.ID=0    
        
    def imprimir(self):
        print self.Nombre + " --> " + self.NumTelefono
        
    def insertar(self):
        a1=AccionesSQL()
        a1.insertarTelefonoBD(self.Nombre,self.NumTelefono,self.Notas)
        
    def modificar(self, id1, nombre1, numeroTelefono1, notas1):
        a1=AccionesSQL()
        a1.modificarTelefono(id1, nombre1, numeroTelefono1, notas1)
        
    def suprimir (self, id1):
        a1=AccionesSQL()
        a1.suprimirTelefonoBD(id1)
    
    def listar(self):
       a1=AccionesSQL()
       a1.listarTelefonosBD()
       
    def buscarPorNumero (self, numero1, op1):
        a1=AccionesSQL()
        a1.buscarTelefonosBDxNumero(numero1,op1) 

La sentencia from AccionesSQL import AccionesSQL sirve para importar el código creado en la clase anterior. De esta manera podremos funcionar con las funciones anteriores llamándolas desde u objeto de esa clase.

Así por ejemplo en la función  insertar podremos utilizar la función insertarTelefonoBD después de haber cread un objeto. Y en las diferentes funciones, el funcionamiento es igual.

Si he creado dos clases no ha sido por ir de listo, sino porque así todo funciona mejor. Es más sencillo y eficiente.


Saludos.

El zen de Python



Estos son los principios que todo buen programador de Python debe cumplir para considerarse tal, fueron redactados por el padre del lenguaje: Tim Peters:


1. Bello es mejor que feo.
2. Explícito es mejor que implícito.
3. Simple es mejor que complejo.
4. Complejo es mejor que complicado.
5. Plano es mejor que anidado.
6. Disperso es mejor que denso.
7. La legibilidad cuenta.
8. Los casos especiales no son tan especiales como para quebrantar las reglas.
Aunque lo práctico gana a la pureza.
9. Los errores nunca deberían dejarse pasar silenciosamente.
10. A menos que hayan sido silenciados explícitamente.
11. Frente a la ambigüedad, rechaza la tentación de adivinar.
12. Debería haber una -y preferiblemente sólo una- manera obvia de hacerlo.
13. Aunque esa manera puede no ser obvia al principio a menos que usted sea holandés.
Ahora es mejor que nunca.
14. Aunque nunca es a menudo mejor que ya mismo.
15. Si la implementación es difícil de explicar, es una mala idea.
16.Si la implementación es fácil de explicar, puede que sea una buena idea.
17. Los espacios de nombres (namespaces) son una gran idea ¡Hagamos más de esas cosas!