Python y SqLite3 como base de datos

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

  1. Unknown dice:

    Muy buen artículo!

    1. PythonDiario dice:

      Gracias Alejandro. Un abrazo

    2. anonimo dice:

      Gracias buen aportazo, justamente lo que he andado buscando

  2. Anónimo dice:

    Me sirvio mucho gracias

  3. Unknown dice:

    gracias muchas gracias me sirvio bastante, justo lo que buscaba

  4. Signox dice:

    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 http://www.lawebdelprogramador.com imprescindible flipante facil y de todo tipo de lenguajes...

    1. PythonDiario dice:

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

  5. Anónimo dice:

    Buenas Diego,

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

    1. PythonDiario dice:

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

  6. Unknown dice:

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

    1. PythonDiario dice:

      Gracias a ti Diego por tu comentario. Saludos

  7. JhonBarc dice:

    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.

  8. Unknown dice:

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

    1. PythonDiario dice:

      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...

  9. Bocanalisis dice:

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

    1. PythonDiario dice:

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

  10. Unknown dice:

    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.

    1. PythonDiario dice:

      Hola, muchas gracias por tus sugerencias, las tendré en cuenta. Gracias por visitar el blog. Saludos 😉

  11. Anónimo dice:

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

    1. PythonDiario dice:

      Gracias a ti por visitar el blog. Saludos

  12. Unknown dice:

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

    1. PythonDiario dice:

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

  13. Unknown dice:

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

  14. Asley Echarry dice:

    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=('''nn....................................................................nn''')
    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=('''nn....................................................................nn''')
    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!!!!

  15. Unknown dice:

    ¿Esto se podría hacer en Oracle?

  16. csgoknives dice:

    Muy buen articulo

    1. PythonDiario dice:

      Gracias Victor por pasarte!!!
      Saludos

  17. Anónimo dice:

    Diego, tengo una duda sobre un aspecto que creo que es muy simple pero no encuentro la forma de resolverlo desde Python y es cómo saber los nombres de las tablas de una base de datos sqlite si solo conozco el nombre del archivo de la base. Agradezco desde ya tu respuesta.
    Francisco

    1. PythonDiario dice:

      Hola, puedes probar con esto:

      import sqlite3, os

      con = sqlite3.connect('database.db')
      cursor = con.cursor()
      cursor.execute("SELECT name FROM sqlite_master WHERE type='table';")
      print(cursor.fetchall())

      #Cambia por tu ruta donde dice database.db

      Saludos

  18. Anónimo dice:

    Excelente Diego, funcionó perfectamente, es exactamente lo que quería. Gracias por tu colaboración y felicitaciones por esta página que brinda respuestas rápidas y concretas.
    Y como complemento general a la consulta anterior, me interesaría saber donde puedo acceder a la documentación que me permita conocer mejor sqlite para ser utilizado desde Python.
    Que tengas un muy feliz 2017 y continúa adelante con este importante servicio de apoyo a la comunidad Python.

    1. PythonDiario dice:

      Hola, gracias por tu comenatario!!!
      Seguramente puedas fijarte en la documentación oficial: https://docs.python.org/2/library/sqlite3.html

      Saludos y feliz 2017 para ti también!!

      Saludos

  19. Admin dice:

    Hola, muy buen articulo, tenes alguna base de datos en sqlite con informacion ya puesta, para practicas de SQL?.

    Saludos y muchas gracias

    1. PythonDiario dice:

      Hola José, gracias por escribir y visitar el blog. Lamentablemente en este momento no tengo ninguna base precargada.
      Saludos

  20. Unknown dice:

    Buen articulo Diego. Queria saber si hay agun articulo o alguna documentacion que diga como hacerlo con inputs porque me dije en la pagina de python y no dice nada, te pregunto porque por ahi sabes de algun atticulo. Saludos gracias de ante mano.

    1. PythonDiario dice:

      Hola Lautaro, como estas? gracias por visitar el blog. Te dejo un link de una agenda que hice ya algún tiempo: Agenda con Python y Sqlite3

  21. Jesus Solis dice:

    Saludos, diego caraballo!
    Disculpa, tengo un error en mi codigo que no puedo ver.. en resumidas cuentas al momento de insertar datos a una tabla todo parece marchar sin errores, pero al momento de querer consultarlos esta no arroja ningun registro, tengo otras tablas que si devuelven datos, pero esta no..
    queria anexar el codigo en el comentario pero me dice que es muy extenso, asi que si dispones de tiempo, agradeceria tu ayuda, de igual manera. buen contenido! 🙂

    1. PythonDiario dice:

      Hola Jesus, gracias por visitar el blog!!!
      Que raro te funcione para algunas tablas y otras no. ¿No te devuelve ningún mensaje de error? Podrías compartir solo la parte de los insert? Y el select?

      Saludos

  22. Anónimo dice:

    Muy buen articulo, me ayudo mucho

  23. maxtor dice:

    excelente articulo!!!!!
    vas de menor a mayor. me encanta la forma de explicar.
    muchas gracias

  24. Anónimo dice:

    Heey amigo. Saludos desde Venezuela.
    Excelente articulo. Me he puesto a hacer todos los ejercicios que propones, y voy por este de la base de datos, solo que no habia notado que habian comentarios de este año xD
    Muy buen trabajo. Gracias por el apoyo a la comunidad.
    Pulgar Arriba por eso =)

  25. Unknown dice:

    Como puedo hacer para que el id descienda al eliminar el registro anterior

  26. Unknown dice:

    Como puedo hacer para que el id descienda al eliminar el registro anterior

  27. kone9 dice:

    Este comentario ha sido eliminado por el autor.

  28. kone9 dice:

    Este comentario ha sido eliminado por el autor.

  29. kone9 dice:

    Este comentario ha sido eliminado por el autor.

  30. kone9 dice:

    HOla tengo un problema con la libreria sqlite3
    tiene que ver con
    ValueError: operation parameter must be str or unicode
    ........................................................................................................................
    import sqlite3

    conexion= sqlite3.connect("C:/Users/ariel/Desktop/prueba")
    consulta=conexion.cursor()

    tabla= "CREATE TABLE tabla ("
    "id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL",
    "nombre VARCHAR(30) NOT NULL",
    "autor VARCHAR(40)NOT NULL",
    "year INTEGER(9)NOT NULL);"

    print (tabla)
    print ("la base de datos se creo correctamente")

    if (consulta.execute(tabla)):
    print("la tabla fue creada")
    else:
    print ("la tabla no fue creada")

    consulta.close()
    conexion.commit()
    conexion.close()
    ........................................................................................................................
    Me salta este error en la linea 15

    la base de datos se creo correctamente
    File "C:/Users/ariel/Documents/MEGA/MEGAsync/Curso de python/curso de programaci�n en python/nivel 2/nivel 2/base de datos/novelas.py", line 15, in
    if (consulta.execute(tabla)):
    ValueError: operation parameter must be str or unicode

    Tenes idea como solucionarlo,yo no lo puedo entender,parece que el error está cuando en la condición "if" (consulta.execute(tabla)) pongo como parametro a "tabla",osea la variable que cree para almacenar los valores de la tabla.

  31. Unknown dice:

    Muy interésate me ayudo en mucho tu explicación si me gustaría si hay mismo en la línea de código le pudiera hacer una búsqueda y modificar. Espero q me pueda ayudar con eso. Te felicito por la explicación

  32. Anónimo dice:

    Muchas gracias me ayudo mucho, pero tengo una pregunta ¿Como puedo hacer tablas relacionales?

  33. Santiago dice:

    Muy bien explicado. Vale la pena leer todo, Gracias.

  34. Renled dice:

    Buenas, y como hago para introducir los registros en la tabla mediante inputs, gracias.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Subir
White Monkey