Base de datos SQLite con sqlite3

(Actualizado el 22/02/2019).

Introducción

SQLite es una librería escrita en C que provee una base de datos simple, rápida y segura.

El módulo estándar sqlite3 nos brinda una interfaz de acceso a dicha librería. Esta entrada tiene como objetivo dar a conocer el mismo, con variadas explicaciones y ejemplos; sin embargo, no pretende describir la sintaxis del lenguaje SQL.

Aplicación

Base de datos en disco

Para acceder a cualquier base de datos primero es necesario crear un objeto Connection que representa dicha base. Por ejemplo, en el siguiente código la función sqlite3.connect retorna un objeto Connection el cual nos va a permitir trabajar sobre el archivo ejemplo.db.

import sqlite3
conn = sqlite3.connect("ejemplo.db")

Si la base de datos ejemplo.db no existe, el módulo la crea automáticamente.
Una vez hecha la conexión, creamos un cursor, por el cual podremos ejecutar comandos SQL vía el método execute().

cursor = conn.cursor()

Mediante el siguiente código, creamos una tabla Direcciones y agregamos dos filas.

# Creamos la tabla de Direcciones
cursor.execute("CREATE TABLE Direcciones (calle TEXT, cp NUMERIC)")

# Agregamos dos direcciones
cursor.execute("INSERT INTO Direcciones VALUES ('Calle 1', 1644)")
cursor.execute("INSERT INTO Direcciones VALUES ('Calle 2', 7594)")

O simplemente con una sola llamada al método executescript(), que permite ejecutar múltiples comandos.

cursor.executescript(
    "CREATE TABLE Direcciones (calle TEXT, cp NUMERIC);"
    "INSERT INTO Direcciones VALUES ('Calle 1', 1644);"
    "INSERT INTO Direcciones VALUES ('Calle 2', 7594);"
)

Luego, guardar los cambios con la función commit(). De no llamarlo, una vez cerrada la conexión los cambios se habrán perdido. Por lo tanto, recuerda siempre llamar a dicho método si anteriormente has realizado llamadas a execute() alterando los datos contenidos en la base.

conn.commit()  #  Guardar cambios

Para retornar información de ejemplo.db, ejecutamos el comando y le asignamos el valor de retorno a una variable:

q = cursor.execute("SELECT calle, cp FROM Direcciones")

En este caso, q es un objeto del tipo sqlite3.Cursor. Para acceder a los datos contenidos en él utilizamos las funciones fetchone() y fetchall() que retornan el siguiente elemento en la lista, en el caso de la primera, y todos, en el caso de la segunda.

print(q.fetchone())
print(q.fetchone())

Imprime:

('Calle 1', 1644)
('Calle 2', 7594)

Una tupla con los valores en el orden que lo hemos especificado en el comando (calle, cp). Vale aclarar que los datos se almacenan en una cola (los datos son removidos luego de haber sido leídos), por lo que una tercera llamada a fetchone() retornaría None, ya que no hay más datos para obtener.

Ahora, usando el método fetchall(), retorna la lista entera.

q = cursor.execute("SELECT calle, cp FROM Direcciones")
print(q.fetchall())

Imprime:

[('Calle 1', 1644), ('Calle 2', 7594)]

Con el siguiente código podemos recorrer el resultado e imprimir cada uno de los valores:

for data in q.fetchall():
    print("Calle: %s, Código Postal: %d" % (data[0], data[1]))

Por último, cerramos el cursor y la conexión:

cursor.close()
conn.close()

Código completo:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sqlite3
conn = sqlite3.connect("ejemplo.db")
cursor = conn.cursor()

# Creamos la tabla de Direcciones
cursor.execute("CREATE TABLE Direcciones (calle TEXT, cp NUMERIC)")

# Agregamos dos direcciones
cursor.execute("INSERT INTO Direcciones VALUES ('Calle 1', 1644)")
cursor.execute("INSERT INTO Direcciones VALUES ('Calle 2', 7594)")

q = cursor.execute("SELECT calle, cp FROM Direcciones")

for data in q.fetchall():
    print("Calle: %s, Código Postal: %d" % (data[0], data[1]))

conn.commit()
cursor.close()
conn.close()

Base de datos en memoria

En el caso anterior, la base de datos es guardada como ejemplo.db, es decir, en el disco. sqlite3 también nos permite almacenarla en la memoria RAM, indicando :memory: en lugar del nombre del archivo:

import sqlite3
conn = sqlite3.connect(":memory:")

Una vez cerrada la conexión la memoria será liberada, por lo que todo dato que hayamos almacenado se habrá perdido.

Más información

Información detallada del módulo y cada una de sus funciones y clases en la documentación oficial.

Curso online 👨‍💻

¡Ya lanzamos el curso oficial de Recursos Python en Udemy! Un curso moderno para aprender Python desde cero con programación orientada a objetos, SQL y tkinter en 2024.

Consultoría 💡

Ofrecemos servicios profesionales de desarrollo y capacitación en Python a personas y empresas. Consultanos por tu proyecto.

3 comentarios.

  1. hola una pregunta como hago para sacar un valor de la base de datos e imprimirlo en una variable?
    importo por ejemplo de la lista caja, dinero en efectivo , y me imprime ese valor como hago para guardar ese valor que importe en una variable ?

    • Recursos Python says:

      Hola, puedes usar algo como money = q.fetchone()[0] luego de q = cursor.execute(...). Recuerda que fetchone() retorna una tupla, por más que solo haya un elemento.

      Saludos.

Deja una respuesta