Mostramos un ejemplo en Python sobre cómo crear base de datos SQLite, cómo trabajar con tablas SQLite en memoria y hacerlas persistentes en disco. El código fuente de ejemplo incluye tratamiento de base de datos SQLite en memoria para crear tablas, insertar registros, recorrer registros y mostrar el resultado. También incluye el mismo tratamiento pero de tablas SQLite en disco.

SQLite

SQLite es un sistema de gestión de bases de datos relacional compatible con ACID (permite realizar transacciones).

A diferencia de los sistema de gestión de bases de datos cliente-servidor, el motor de SQLite no es un proceso independiente con el que el programa principal se comunica. En lugar de eso, la biblioteca SQLite se enlaza con el programa pasando a ser parte integral del mismo. El programa utiliza la funcionalidad de SQLite a través de llamadas simples a subrutinas y funciones. Esto reduce la latencia en el acceso a la base de datos, debido a que las llamadas a funciones son más eficientes que la comunicación entre procesos.

El conjunto de la base de datos (definiciones, tablas, índices, y los propios datos), son guardados como un solo fichero estándar en el equipo. Este diseño simple se logra bloqueando todo el fichero de base de datos al principio de cada transacción.

En su versión 3, SQLite permite bases de datos de hasta 2 Terabytes de tamaño, y también permite la inclusión de campos tipo BLOB.

SQLite no necesita, por tanto, de instalación de software adicional ni de servicios corriendo en el equipo, únicamente se necesitará las librerías o paquetes de acceso a SQLite en cada lenguaje de programación. En el caso de este tutorial, usaremos Python como lenguaje y su librería sqlite3 (para ello realizaremos el import correspondiente, como explicaremos en el código fuente de ejemplo). Por lo tanto no requiere de servicios iniciados, ni de uso de puertos, ni nada por el estilo, es similar a una base de datos de escritorio tipo Access.

En ProyectoA encontrarás numerosos artículo sobre SQLite:

Python

Python es un lenguaje de programación. En el siguiente artículo explicamos cómo instalar el paquete necesario para poder programar en Python y para poder ejecutar las aplicaciones Python. También mostramos un IDE de desarrollo para Python:

Ejemplo de código fuente de acceso y tratamiento de tablas SQLite con Python

A continuación mostramos el código fuente completo de un ejemplo en Python que realiza las siguientes acciones:

  • Crea una base de datos SQLite en memoria (sin persistencia en disco).
  • Crea una tabla en esta base de datos.
  • Inserta registros en la tabla.
  • Obtiene los registros de la tabla y los muestra por pantalla.
  • Guarda la base de datos de memoria a disco en formato SQLite, la hace persistente.
  • Conecta con la base de datos SQLite de disco.
  • Obtiene el nombre de todas las tablas que contiene dicha base de datos SQLite.
  • Ejecuta un select y muestra todos los registros de la tabla creada anteriormente.

Podéis descargar el fichero .py que contiene el código fuente completo en el siguiente enlace:

El código fuente está comentado y descrita cada parte que se considera importante:

import sqlite3
from datetime import date

print ("Creando BD SQLite y tabla en memoria...")

#Conexión con SQLite en memoria
conexionSQLiteMemoria = sqlite3.connect(':memory:')
cursor = conexionSQLiteMemoria.cursor()

#Creamos una tabla SQLite en memoria
#El campo "codigo" será la clave primaria y será autoincremento
sqlCrearTabla = """CREATE TABLE facturacion (
    'codigo' integer primary key autoincrement,
    'id_cliente' integer,
    'num_factura' varchar(15),
    'fecha' date,
    'importe' money
)"""

#Para crear la tabla SQLite en memoria con el SQL anterior
cursor.execute(sqlCrearTabla)

#Creamos una lista con varios registros de prueba para posteriormente insertarlos en la tabla
#No pasaremos el campo "codigo", dado que se generará automáticamente como autoincremento
datosRegistrosPrueba = [
    (25, 'AG445', date.today(), 4500.89),
    (30, 'AG218', date.today(), 3200.00),
    (25, 'BB450', date.today(), 1200.00),
    (30, 'AG218', date.today(), 3200.00),
]

print ("Insertando registros en tabla facturacion SQLite de memoria...")

#Preparamos el SQL para la inserción de los registros
#No pasaremos el campo "codigo", dado que se generará automáticamente como autoincremento
sqlInsertarRegistro = 'INSERT INTO facturacion (id_cliente, num_factura, fecha, importe) VALUES (?, ?, ?, ?)'

#Recorremos todos los miembros de la lista anterior para insertarlos en la tabla SQLite
for registro in datosRegistrosPrueba:
    cursor.execute(sqlInsertarRegistro, registro)

print ("Obteniendo registros de la tabla facturación de memoria...")

#Para comprobar que ha funcionado corrctamente, ejecutarmos un select de la tabla SQLite
#en memoria para obtener su contenido
sqlSeleccion = 'SELECT codigo, num_factura, id_cliente, fecha, importe FROM facturacion'
cursor.execute(sqlSeleccion)
#Guardamos el resultado en un cursor
resultadoSQLSeleccion = cursor.fetchall()
#Cerramos el cursor y la conexión SQLite para liberarla de memoria
cursor.close()
#Mostramos el resultado por consola
print("Los registros de la tabla SQLite facturacion son:")
print(resultadoSQLSeleccion)

print ("Guardando base de datos SQLite de memoria a disco...")

#Si queremos guardar la base de datos de memoria a disco
conexionSQLiteDisco = sqlite3.connect('bd_disco.sqlite')
for line in conexionSQLiteMemoria.iterdump():
    if line not in ('BEGIN;', 'COMMIT;'):
      conexionSQLiteDisco.execute(line)
conexionSQLiteDisco.commit()
conexionSQLiteDisco.close()
conexionSQLiteMemoria.close()

print ("Abriendo base de datos de disco para mostrar sus tablas...")

#Abrimos la base de datos SQLite de disco para comprobar que se ha guardado
conexionSQLiteDiscoNueva = sqlite3.connect('bd_disco.sqlite')

#Mostramos el nombre de todas las tablas que contenga
def sql_fetch(conexionSQLiteDiscoNueva):    
    cursorObj = conexionSQLiteDiscoNueva.cursor()
    cursorObj.execute('SELECT name from sqlite_master where type = "table"')
    print("\nLas tablas de la base de datos SQLite bd_disco.sqlite son:")
    print(cursorObj.fetchall())
sql_fetch(conexionSQLiteDiscoNueva)

print ("\nObteniendo registros de la tabla facturacion...")

#Obtenemos los datos (registros) de la tabla facturacion que creamos en memoria
conexionSQLiteDiscoNueva.row_factory = sqlite3.Row
query = 'SELECT * from facturacion ORDER BY codigo DESC'
cursor = conexionSQLiteDiscoNueva.cursor()
cursor.execute(query)
results = cursor.fetchall()
cursor.close()
conexionSQLiteDiscoNueva.close()
for result in results:
    codigo = result['codigo']
    idCliente = result['id_cliente']
    numeroFactura = result['num_factura']
    fecha = result['fecha']
    importe = result['importe']
    #Mostramos los datos del registro actual
    print('\n---------------\nCódigo: {}, número: {}'.format(codigo,numeroFactura))
    print('ID Cliente:', idCliente)
    print('Fecha:', fecha)
    print('Importe: {}€'.format(importe))
    print('---------------')

Compilando y probando programa Python con acceso a SQLite

El programa se ejecutará y realizará las tareas anteriores:

Compilando y probando programa Python con acceso a SQLite

Nos habrá creado un fichero en disco, llamado bd_disco.sqlite, que es la base de datos SQLite que contiene la tabla facturacion y sus registros:

Compilando y probando programa Python con acceso a SQLite