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:
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.
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.
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:
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()
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.
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()
Implementaremos un programa que solicite ejecutar un 'select' en la tabla 'articulos' y nos retorne todas sus filas.
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:
El método execute retorna un objeto de la clase Cursor:
cursor=conexion.execute("select codigo,descripcion,precio from articulos")
Implementaremos un programa que solicite el ingreso del código de un producto y luego nos muestre su descripción y precio.
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.")
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.
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.")