87 - SQLite : Base de datos desde Python

Ver video

La segunda base de datos que veremos su acceso desde Python es SQLite.

Se encuentra invitado para desarrollar un curso completo de SQLite Ya!

SQLite también es un gestor de bases de datos relacional pero con objetivos muy diferentes a MySQL, SQLServer, Oracle etc.
Este gestor de base de datos tiene por objetivo ser parte de la misma aplicación con la que colabora, es decir no cumple los conceptos de cliente y servidor.

Para entender sus usos podemos dar algunos ejemplos donde se utiliza el gestor SQLite:

  • Firefox usa SQLite para almacenar los favoritos, el historial, las cookies etc.
  • También el navegador Opera usa SQLite.
  • La aplicación de comunicaciones Skype de Microsoft utiliza SQLite
  • Los sistemas operativos Android y iOS adoptan SQLite para permitir el almacenamiento y recuperación de datos.

SQLite es Open Source y se ha instalado por defecto con Python, es decir forma parte de la biblioteca estándar, no tenemos que instalar ningún módulo con pip.

Si nuestra aplicación necesita almacenar gran cantidad de información local con cierta estructura el empleo de SQLite es nuestra principal opción.

Creación de una base de datos y tablas.

En principio no se requiere tener más que Python instalado para poder trabajar con SQLite. Podemos desde nuestra propia aplicación crear la base de datos y sus tablas.

Programa: ejercicio303.py

import sqlite3

conexion=sqlite3.connect("bd1.db")
try:
    conexion.execute("""create table articulos (
                              codigo integer primary key autoincrement,
                              descripcion text,
                              precio real
                        )""")
    print("se creo la tabla articulos")                        
except sqlite3.OperationalError:
    print("La tabla articulos ya existe")                    
conexion.close()

Para poder trabajar con bases de datos de tipo SQLite debemos primero importar el módulo 'sqlite3':

import sqlite3

Para crear o abrir una conexión con una base de datos existente debemos llamar a la función 'connect' del módulo 'sqlite3':

conexion=sqlite3.connect("bd1.db")

La primera vez que ejecutemos este programa como no existe la base de datos 'bd1.db' se crea, consiste en un único archivo que se localiza en la misma carpeta de nuestra aplicación:

sqlite python

Disponemos un try/except al momento de crear la tabla debido a que si ejecutamos por segunda vez este programa se tratará de crear nuevamente la tabla 'articulos' y al ya existir se genera una excepción de tipo 'OperationalError':

try:
    conexion.execute("""create table articulos (
                              codigo integer primary key autoincrement,
                              descripcion text,
                              precio real
                        )""")
    print("se creo la tabla articulos")                        
except sqlite3.OperationalError:
    print("La tabla articulos ya existe")                    

Si no queremos disponer la excepción 'OperationalError' podemos modificar el comando SQL de la creación de la tabla con la sintaxis:

import sqlite3
conexion=sqlite3.connect("bd1.db")
conexion.execute("""create table if not exists articulos (
                          codigo integer primary key AUTOINCREMENT,
                          descripcion text,
                          precio real
                    )""")
conexion.close()

Insertar filas en una tabla.

Ahora implementaremos un programa que inserte un par de filas en la tabla 'articulos' de la base de datos 'bd1' que acabamos de crear con el programa anterior.

Programa: ejercicio304.py

import sqlite3

conexion=sqlite3.connect("bd1.db")
conexion.execute("insert into articulos(descripcion,precio) values (?,?)", ("naranjas", 23.50))
conexion.execute("insert into articulos(descripcion,precio) values (?,?)", ("peras", 34))
conexion.execute("insert into articulos(descripcion,precio) values (?,?)", ("bananas", 25))
conexion.commit()
conexion.close()

Llamamos a execute y le pasamos como primer parámetro un comando SQL 'insert' con el caracter '?' indicamos las posiciones donde se van a sustituir. El segundo parámetro es una tupla con los datos que se utilizarán en la sustitución:

conexion.execute("insert into articulos(descripcion,precio) values (?,?)", ("naranjas", 23.50))

Luego de efectuar todos los insert debemos llamar a 'commit' para que se actualicen los datos realmente en la tabla de la base de datos:

conexion.commit()

Recuperar todas las filas de una tabla.

Implementaremos un programa que solicite ejecutar un 'select' en la tabla 'articulos' y nos retorne todas sus filas.

Programa: ejercicio305.py

import sqlite3

conexion=sqlite3.connect("bd1.db")
cursor=conexion.execute("select codigo,descripcion,precio from articulos")
for fila in cursor:
    print(fila)
conexion.close()

Si ejecutamos este programa luego de haber cargado las tres filas del ejercicio anterior el resultado será el siguiente:

sqlite select python

El método execute retorna un objeto de la clase Cursor:

cursor=conexion.execute("select codigo,descripcion,precio from articulos")

Recuperar una fila de una tabla.

Implementaremos un programa que solicite el ingreso del código de un producto y luego nos muestre su descripción y precio.

Programa: ejercicio306.py

import sqlite3

conexion=sqlite3.connect("bd1.db")
codigo=int(input("Ingrese el código de un artículo:"))
cursor=conexion.execute("select descripcion,precio from articulos where codigo=?", (codigo, ))
fila=cursor.fetchone()
if fila!=None:
    print(fila)
else:
    print("No existe un artículo con dicho código.")
conexion.close()

El resultado de este comando SQL select puede ser de una fila si existe el código de artículo ingresado o cero filas:

cursor=conexion.execute("select codigo,descripcion,precio from articulos where codigo=?", (codigo, ))
fila=cursor.fetchone()

El método fechone de la clase Cursor retorna una tupla con la fila de la tabla que coincide con el código ingresado o retorna 'None':

fila=cursor.fetchone()
if fila!=None:
    print(fila)
else:
    print("No existe un artículo con dicho código.")

Recuperar varias filas de una tabla.

Implementaremos un programa que solicite el ingreso de un precio y luego nos muestre la descripción de todos los artículos con un precio inferior al ingresado.

Programa: ejercicio307.py

import sqlite3

conexion=sqlite3.connect("bd1.db")
precio=float(input("Ingrese un precio:"))
cursor=conexion.execute("select descripcion from articulos where precio<?", (precio, ))
filas=cursor.fetchall()
if len(filas)>0:
    for fila in filas:
        print(fila)
else:
    print("No existen artículos con un precio menor al ingresado.")
conexion.close()

En este caso el resultado del comando 'select' pueden ser muchas filas:

cursor=conexion.execute("select descripcion from articulos where precio<?", (precio, ))

Llamamos al método 'fetchall' de la clase Cursor y nos retorna una lista con todas las filas de la tabla que cumplen la condición de tener un precio inferior al ingresado:

filas=cursor.fetchall()

En el caso que la lista no esté vacía procedemos a imprimirla:

if len(filas)>0:
    for fila in filas:
        print(fila)
else:
    print("No existen artículos con un precio menor al ingresado.")