Google+ Seguidores

miércoles, 4 de diciembre de 2013

Python y SqLite3 como base de datos

    26

Sqlite3 y Python
Sqlite3 y Python
Hoy voy a explicar lo que he ido aprendiendo sobre bases de datos en python. En este caso trabajaré con SqLite3, que a partir de la versión 2.5 de python ya viene con su modulo integrado.

SqLite es un paquete de software de dominio público que proporciona un sistema de gestión de base de datos relacional. Los sistemas de bases de datos relacionales se utilizan para almacenar los registros definidos por el usuario en tablas grandes. Además del almacenamiento y gestión de datos, un motor de base de datos puede procesar consultas complejas que combinan datos de varias tablas para generar informes y resúmenes de datos.

Podemos probar en el shell de python que todo este funcionando bien con SqLite3 importando el modulo:


Como vemos, al importar el módulo todo sigue funcionando correctamente.

Conexión a la base de datos SqLite3

Comenzaremos creando y conectando la base de datos en un archivo que llamare sqlite.py . Si la base de datos no existe se creará con el nombre y la ruta que especifiquemos. En este caso la base de datos no existe y por lo tanto cuando ejecute el archivo se creará con el nombre prueba.db .


Como podemos ver, lo primero que hacemos es importar el módulo sqlite3. Para usar el módulo, primero debemos crear una conexión con el objeto que representa la base de datos (sqlite3.connect()). Una ves hecha la conexión con la base de datos, podemos crear el objeto cursor y llamar el método execute() para ejecutar comandos SQL. El objeto cursor se utiliza para obtener, insertar, actualizar o borrar datos de nuestra base de datos.

También podemos hacer que nuestra base de datos solo se cargue en memoria (se ilustra en la imagen con color rojo) sustituyendo por :memory: la ruta de nuestra base de datos.
Al correr este script se creará mi base de datos en el escritorio (en este caso estoy trabajando en windows) con el nombre de prueba.db . Podemos cambiar la ruta según nuestra conveniencia o también podemos solo cargar en memoria como ya explique anteriormente.
Si todo va bien ejecutamos el archivo y tendremos la siguiente salida:


Crear una tabla en SqLite3

Ya creamos y abrimos nuestra base de datos prueba.db, ahora vamos a crear una tabla para introducir información de nuestra empresa:


La secuencia de comandos CREATE TABLE EMPRESA crea la tabla EMPRESA, en este caso con 5 columnas (ID, NOMBRE, EDAD, DIRECCION Y SALARIO).
Cuando ejecutemos nuestro programa, se creará la tabla EMPRESA en nuestra base de datos (prueba.db) y mostrará el siguiente mensaje:


Insertar datos en la tabla con SqLite3

Ahora insertaremos datos en nuestra tabla EMPRESA. Vas a tener que tener cuidado si estas haciendo el paso a paso porque como ya tenemos creada nuestra base de datos prueba.db y la tabla EMPRESA, si ejecutas el código entero te dará un error diciendo que la tabla EMPRESA ya existe. Puedes hacer dos cosas, borrar la base de datos y al ejecutar se creará nuevamente con la tabla y con los datos a insertar. O también puedes borrar la parte del código que crea la tabla. En mi caso borraré el código que crea la tabla porque ya estoy seguro de que está en mi base de datos.


Para insertar los valores en nuestra tabla lo hacemos con la instrucción INSERT INTO EMPRESA (ID, NOMBRE, EDAD, DIRECCION, SALARIO) VALUES (1, 'Pablo', 32, 'Montevideo', 20000.00)")
Primero pasamos las columnas y luego los valores. Para terminar necesitamos grabar los cambios en la base de datos con con.commit(), esto se aplica para cualquier modificación en la base de datos (INSERT, UPDATE, DELETE) de lo contrario no surtirán efecto las modificaciones.

Si todo salió bien y ejecutamos nuestro sqlite.py veremos lo siguiente:


Mostrar registros de nuestra tabla

Ahora vamos a ver como podemos ver el registro de nuestra tabla EMPRESA creada en el ejemplo anterior:


Seleccionamos lo que queremos visualizar con la instrucción:
cursor.execute("SELECT id, nombre, direccion, salario from EMPRESA")
Y luego con un ciclo for lo mostramos en pantalla.
Pueden ver también que la conexión de la base de datos es cerrada cada ves que se termina de utilizar, como se hace también cuando se trabaja con archivos. En este caso escribimos con.close().

Y cuando se ejecute el programa esta será la salida:


Actualizar registros

Ahora vamos a ver como podemos actualizar nuestros registros con la instrucción UPDATE y luego buscar y mostrar los registros actualizados de la tabla EMPRESA:


Lo que hicimos acá fue modificar el SALARIO al funcionario con el ID = 1, en este caso "Pablo". Lo hicimos con la instrucción:
cursor.execute("UPDATE EMPRESA set SALARIO = 45000.00 where ID=1")
Luego hicimos un con.commit() para guardar la modificación, y con la instrucción con.total_changes imprimimos el número de modificaciones que hemos realizado en nuestra base de datos.

Si todo salió bien la modificación quedaría así:



Borrar registros en SqLite3

Con la instrucción DELETE podemos borrar registros de nuestra tabla:


Lo que hacemos acá es borrar un registro de la tabla EMPRESA (en este caso borramos el registro que tiene el ID=2), para eso utilizamos la instrucción:
cursor.execute("DELETE from EMPRESA where ID=2")
Una ves más guardamos las modificaciones con con.commit() y por último imprimimos la cantidad de registros borrados.


Bueno espero esto sirva como introducción y puedan crear sus primeras bases de datos como lo estoy haciendo yo. En estos momentos estoy investigando sobre los gestores gráficos de bases de datos como por ejemplo SqLiteStudio, que hacen más fácil la tarea de crear bases de datos, tablas y registros. Mas adelante publicaré mis avances.

Por cualquier sugerencia, corrección o duda, dejar sus comentarios al final de entrada. Saludos
Diego

26 comentarios:
Write comentarios
  1. gracias muchas gracias me sirvio bastante, justo lo que buscaba

    ResponderEliminar
  2. Me gusto mucho, muy bien explicado como a mi me gusta XD. Si das con el flujo de trabajo en un gestor de bases de datos estaré encantado de verlo... y si doy yo con uno de mostrarlo para que aprendamos todos de todos. Y una pagina que me a encantado para mi que soy principiante en python es esta www.lawebdelprogramador.com imprescindible flipante facil y de todo tipo de lenguajes...

    ResponderEliminar
    Respuestas
    1. Gracias Signox por tu comentario, he abandonado un poco el blog, voy a ver si lo retomo. Saludos

      Eliminar
  3. Buenas Diego,

    Gracias por compartir, no lo dejes que explicas muy bien!!!.

    ResponderEliminar
    Respuestas
    1. Gracias, quizá no publique tan seguido, pero no pienso abandonar el blog. Saludos

      Eliminar
  4. Me gusto mucho, aunque mi versión de PYTHON era diferente estuvo muy claro, gracias por la info.

    ResponderEliminar
    Respuestas
    1. Gracias a ti Diego por tu comentario. Saludos

      Eliminar
  5. Soy novato en programación (cero lenguajes hasta hace unos días que empecé con python). Tu sitio acaba de entrar a favoritos, muy bueno.
    Me pregunto si podrías darme una pista para resolver algo:
    He creado un programita (Soy técnico en electrónica) al que le das voltajes y potencia y te regresa todos los datos necesarios para construir un transformador (área del núcleo, amperajes, vueltas de los devanados etc). Pero quiero a medida que aprendo nuevas cosas, hacerlo más elegante y funcional (Interfaz gráfica para futuras versiones).
    Por lo pronto me gustaría aplicar una base de datos (Por aplicar este excelente tutorial) que contenga los calibres necesarios para el alambrado, lo cual depende del amperaje.
    Hasta ahí bien, pero no sé cómo "llamar" un calibre u otro de acuerdo al amperaje que ingrese el usuario.
    Resolví antes un problema similar con condicionales del tipo:
    if var>0 and var<3:
    var2=1
    if var>3 and var<5:
    var2=2
    if var>5 and var<8:
    var2=3

    Y así sucesivamente. ahora me gustaría hacerlo de manera que cuando el usuario introduzca un valor numérico (La variable var en mi ejemplo) el programa devuelva el resultado para var2 tomándolo de sqlite).
    ¿Me das una pista por favor?

    Gracias de antemano.

    ResponderEliminar
  6. Muy buen articulo! Aquí hay unos cuantos administradores gráficos de BD para SQLite3 http://soyprogramador.liz.mx/clientes-para-sqlite/

    ResponderEliminar
    Respuestas
    1. Gracias Martín. Estuve mirando los administradores gráficos que mencionas y están muy buenos. Yo utilizo Sqliteman, para hacer pruebas me parece que es el más sencillo. Saludos y gracias por visitar el blog...

      Eliminar
  7. Copiado de la pagina que sigue a esta en google. Muy trucha

    ResponderEliminar
    Respuestas
    1. Entonces utiliza el que más te sea de ayuda. Gracias por preocuparte!!!

      Eliminar
  8. Muy buen articulo eres bueno explicando, solo me gustaria hacerte un pequeña sugerencia, publica tus datos personales, carrera lugar donde estudiaste, fecha en que subes tus articulos, cuales son tus fuentes, para que haci te podamos citar facilmente como fuente confiable de informacion en investigaciones, tareas, trabajos etc.

    ResponderEliminar
    Respuestas
    1. Hola, muchas gracias por tus sugerencias, las tendré en cuenta. Gracias por visitar el blog. Saludos ;)

      Eliminar
  9. Gracias amigo, muy buen trabajo (como siempre). Saludos

    ResponderEliminar
  10. Exelente explicación, recién me estoy iniciando en esto. veremos que pasa. Gracias

    ResponderEliminar
    Respuestas
    1. Gracias Marcelo, y me alegro te sea de ayuda. Saludos

      Eliminar
  11. A mi me tiraba un error en el path y ulitice en lugar de la barra \ la / y me funcionó desde Windows. Saludos

    ResponderEliminar
  12. Saludos... Excelente post

    Me gustaría consultarte sobre el trabajo de python y bases de datos en sqlite3

    realice un sistema que carga datos de usuarios... nombre, apellido, dirección lo común, le realice la interfaz con Tkinter y todo de maravilla. Para hacerlo robusto... tiene su formulario de ingreso, búsqueda y eliminación de usuario...
    en la parte de eliminar usuario (la función) todo funciona de maravilla... te coloco el código para que le tires un ojo:

    def eliminar():
    '''ventana de eliminar'''
    def eliminar():
    ide=e1.get()
    if ide=='':
    tkMessageBox.showinfo('Alerta del sistema','no encontrado')
    print("not found")
    else:
    cursor.execute("SELECT cedula, Nombre, Apellido, telefono, dirección from USUARIO WHERE cedula = '" + ide + "'")
    for i in cursor:
    marco=('''\n\n....................................................................\n\n''')
    Nombre = i[1]
    Apellido = i[2]
    Cedula = i[0]
    tlf = i[3]
    Direccion = i[4]
    datos=(Nombre,Apellido,Cedula,tlf,Direccion)
    mostrar=Label(ventana3,text=marco,bg="white",fg="blue")
    mostrar.pack()
    mostrar_usuario=Label(ventana3,text=datos,bg="white")
    mostrar_usuario.pack()
    mostrar=Label(ventana3,text=marco,bg="white",fg="blue")
    mostrar.pack()
    tkMessageBox.askquestion("Eliminar del Sistema","¿Seguro quiere eliminar?", icon="warning")
    if 'si':
    cursor.execute("DELETE from USUARIO WHERE cedula = '" + ide + "'")
    cnn_db.commit()
    tkMessageBox.showinfo('Alerta del sistema','Eliminado con éxito')
    print("erase")
    ventana3.destroy()

    el problema lo tengo es cuando quiero, en la función de búsqueda de usuario pues quiero generar un mensaje (con tkMessageBox) cuando el registro que se busca no esta en la tabla USUARIO... N o consigo el valor de exception para este proceso...
    si me puedes ayudar te lo agradezco...
    el código de la función de búsqueda es:

    def buscar():
    '''ventana de buscar'''
    def buscar():
    ide=e1.get()
    cursor.execute("SELECT cedula, Nombre, Apellido, telefono, dirección from USUARIO WHERE cedula = '" + ide + "'")
    if cursor.execute==0:
    print("no")
    if ide=='' or None or 0:
    tkMessageBox.showwarning('Alerta del sistema','Campo de Búsqueda Vacío')
    for raw in cursor:
    marco=('''\n\n....................................................................\n\n''')
    mostrar=Label(ventana2,text=marco,bg="white",fg="blue")
    mostrar.pack()
    mostrar_usuario=Label(ventana2,text=raw,bg="white")
    mostrar_usuario.pack()
    mostrar=Label(ventana2,text=marco,bg="white",fg="blue")
    mostrar.pack()
    e1.delete(0, END)
    print('ready')
    ventana2=Tk()
    ventana2.title("EDCI Administración de Usuarios ")
    ventana2.geometry("600x600+200+100")
    ventana2.maxsize(800, 400)
    titulo=Label(ventana2,text="*** Sistema EDCI ***",fg="blue",bg="white",height=1,font=('Ravie', 24))
    titulo.pack()
    titulo_b=Label(ventana2,text="Busqueda de usuario registrado",fg="blue",bg="white",height=1,font=('Ravie', 10))
    titulo_b.pack()
    l1 = Label(ventana2,text="Número de Cédula: ",bg="white")
    l1.pack(pady=10)
    e1 = Entry(ventana2)
    e1.pack(pady=5)
    boton_busque = Button(ventana2, text="Buscar", width=10,fg='white',bg='blue',command=buscar)
    boton_busque.pack(pady=5)
    ventana2.config(bg="white",menu=menu_bar)
    ventana2.mainloop()

    un abrazo!!!!

    ResponderEliminar

Tu comentario es importante y nos motiva a seguir escribiendo...

Entradas más recientes

© 2014 Mi diario Python. Designed by Bloggertheme9 | Distributed By Gooyaabi Templates
Powered by Blogger.