El autor seleccionó el fondo de alivio COVID-19 para recibir una donación como parte del Programa Escribir para donaciones.
Introducción
SQLite es una base de datos SQL autónoma basada en archivos. SQLite viene incluido con Python y se puede usar en cualquiera de sus aplicaciones Python sin tener que instalar ningún software adicional.
en este tutorial, veremos el módulo sqlite3
en Python 3., Vamos a crear una conexión a una base de datos SQLite, agregar una tabla a la base de datos, insertar datos en la tabla, y leer y modificar los datos en la tabla.
para este tutorial, trabajaremos principalmente con un inventario de peces que necesitamos modificar a medida que los peces se agregan o eliminan de un acuario ficticio.
prerequisitos
para aprovechar al máximo este tutorial, se recomienda tener cierta familiaridad con la programación en Python y algunos antecedentes básicos con SQL.,
Puede revisar estos tutoriales para obtener la información de fondo necesaria:
- Cómo codificar en Python3
- Una Introducción a las consultas en MySQL
Paso 1 — Crear una conexión a una base de datos SQLite
Cuando nos conectamos a una base de datos SQLite, estamos accediendo a datos que finalmente residen en un archivo en nuestro equipo. Las bases de datos SQLite son motores SQL con todas las funciones que se pueden usar para muchos propósitos. Por ahora, consideraremos una base de datos que rastrea el inventario de peces en un acuario ficticio.,
podemos conectarnos a una base de datos SQLite usando el módulo Python sqlite3
:
import sqlite3connection = sqlite3.connect("aquarium.db")
import sqlite3
le da a nuestro programa Python acceso al módulo sqlite3
. La función sqlite3.connect()
devuelve un objeto Connection
que usaremos para interactuar con la base de datos SQLite contenida en el archivo aquarium.db
. El aquarium.db
archivo es creado automáticamente por sqlite3.connect()
si aquarium.db
ya no existe en nuestro ordenador.,
podemos verificar que hemos creado correctamente nuestro objeto connection
ejecutando:
print(connection.total_changes)
si ejecutamos este código Python, veremos una salida como:
Output0
connection.total_changes
es el número total de filas de la base de datos que se han cambiado por connection
. Como aún no hemos ejecutado ningún comando SQL, 0 total_changes
es correcto.
si, en cualquier momento, nos encontramos con que queremos iniciar este tutorial de nuevo, podemos eliminar el archivo aquarium.db
de nuestro equipo.,
Nota: También es posible conectarse a una base de datos SQLite que reside estrictamente en la memoria (y no en un archivo) pasando la cadena especial ":memory:"
En sqlite3.connect()
. Por ejemplo, sqlite3.connect(":memory:")
. Una base de datos ":memory:"
SQLite desaparecerá tan pronto como su programa Python salga. Esto podría ser conveniente si desea un sandbox temporal para probar algo en SQLite, y no necesita persistir ningún dato después de que su programa salga.,
Paso 2-Agregar datos a la base de datos SQLite
ahora que nos hemos conectado a la base de datos SQLite aquarium.db
, podemos comenzar a insertar y leer datos de ella.
en una base de datos SQL, los datos se almacenan en tablas. Las tablas definen un conjunto de columnas y contienen 0 o más filas con datos para cada una de las columnas definidas., una tabla de nombre fish
que las pistas de los siguientes datos:
nombre | especies | tank_number |
---|---|---|
Sammy | tiburón | 1 |
Jamie | sepia | 7 |
El fish
tabla de seguimiento de un valor de name
, species
y tank_number
para cada uno de los peces en el acuario., Two example fish
rows are listed: one row for a shark
named Sammy
, and one row for a cuttlefish
named Jamie
.
We can create this fish
table in SQLite using the connection
we made in Step 1:
cursor = connection.cursor()cursor.execute("CREATE TABLE fish (name TEXT, species TEXT, tank_number INTEGER)")
connection.cursor()
returns a Cursor
object. Cursor
objects allow us to send SQL statements to a SQLite database using cursor.execute()
., El "CREATE TABLE fish ..."
string es una instrucción SQL que crea una tabla con el nombre fish
con las tres columnas descritas anteriormente: name
de tipo TEXT
, especies de tipo TEXT
, y tank_number
de tipo INTEGER
.,
Ahora que hemos creado una tabla, podemos insertar filas de datos en él:
cursor.execute("INSERT INTO fish VALUES ('Sammy', 'shark', 1)")cursor.execute("INSERT INTO fish VALUES ('Jamie', 'cuttlefish', 7)")
llamamos cursor.execute()
dos veces: una vez para insertar una fila para el tiburón Sammy
en el tanque 1
, y de una vez para insertar una fila para la sepia Jamie
en el tanque 7
. "INSERT INTO fish VALUES ..."
es una instrucción SQL que nos permite agregar filas a una tabla.,
en la siguiente sección, usaremos una instrucción SQL SELECT
para inspeccionar las filas que acabamos de insertar en nuestra tabla fish
.
Paso 3-lectura de datos de la base de datos SQLite
en El Paso 2, agregamos dos filas a una tabla SQLite llamada fish
., Podemos recuperar las filas usando un SELECT
instrucción SQL:
rows = cursor.execute("SELECT name, species, tank_number FROM fish").fetchall()print(rows)
Si ejecutamos este código, vamos a ver una salida como la siguiente:
Output
El cursor.execute()
función se ejecuta un SELECT
instrucción para recuperar los valores de la etiqueta name
, species
, y tank_number
columnas en el fish
tabla. fetchall()
recupera todos los resultados de la etiqueta SELECT
declaración., Cuando print(rows)
vemos una lista de dos tuplas. Cada tupla tiene tres entradas; una entrada para cada columna que seleccionamos de la tabla fish
. Los dos tuplas tienen los datos que hemos insertado en el Paso 2: una tupla de Sammy
shark
, y una tupla de Jamie
cuttlefish
.,
si queremos recuperar filas en la tabla fish
que coincidan con un conjunto específico de criterios, podemos usar una cláusula WHERE
:
si ejecutamos esto, veremos una salida como la siguiente:
Output
Al igual que con ejemplo anterior, cursor.execute(<SQL statement>).fetchall()
nos permite obtener todos los resultados de una instrucción SELECT
. El WHERE
cláusula en el SELECT
declaración de filtros para las filas donde el valor de name
es target_fish_name
., Observe que utilizamos ?
para sustituir nuestro target_fish_name
variable en el SELECT
declaración. Esperamos que solo coincida con una fila, y de hecho solo vemos la fila para Jamie
el cuttlefish
devuelto.
ADVERTENCIA: Nunca use operaciones de cadena de Python para crear dinámicamente una cadena de instrucción SQL. El uso de operaciones de cadena de Python para ensamblar una cadena de instrucción SQL le deja vulnerable a los ataques de inyección SQL. Los ataques de inyección SQL se pueden usar para robar, alterar o modificar los datos almacenados en su base de datos., Utilice siempre el marcador de posición ?
en sus instrucciones SQL para sustituir dinámicamente los valores de su programa Python. Pase una tupla de valores como segundo argumento a Cursor.execute()
para vincular sus valores a la instrucción SQL. Este patrón de sustitución se demuestra aquí y en otras partes de este tutorial también.
Paso 4-modificar los datos en la base de datos SQLite
Las filas en una base de datos SQLite se pueden modificar utilizandoUPDATE
yDELETE
instrucciones SQL.,
digamos, por ejemplo, que Sammy el tiburón fue trasladado al tanque número 2. Podemos cambiar Sammy fila en el fish
tabla para reflejar este cambio:
emitimos un UPDATE
instrucción SQL para cambiar el tank_number
de Sammy
a su nuevo valor de 2
. El WHERE
cláusula en el UPDATE
declaración asegura que sólo cambia el valor de tank_number
si una fila tiene name = "Sammy"
.,
Si ejecutamos el siguiente código SELECT
declaración, podemos confirmar nuestra actualización se ha realizado correctamente:
rows = cursor.execute("SELECT name, species, tank_number FROM fish").fetchall()print(rows)
Si ejecutamos esto, vamos a ver una salida como la siguiente:
Output
Observe que la fila para Sammy
ahora tiene el valor de 2
su tank_number
columna.
digamos que Sammy el tiburón fue liberado en la naturaleza y ya no está en el acuario., Dado que Sammy ya no vive en el acuario, tendría sentido eliminar la fila Sammy
de la tabla fish
.
el Tema de un DELETE
instrucción SQL para eliminar una fila:
released_fish_name = "Sammy"cursor.execute( "DELETE FROM fish WHERE name = ?", (released_fish_name,))
la emisión de un DELETE
instrucción SQL para eliminar la fila para Sammy
shark
. El WHERE
cláusula en el DELETE
declaración asegura que sólo eliminar una fila si esa fila tiene name = "Sammy"
.,
Si ejecutamos el siguiente código SELECT
declaración, podemos confirmar nuestra se realizó la eliminación correctamente:
rows = cursor.execute("SELECT name, species, tank_number FROM fish").fetchall()print(rows)
Si ejecutamos este código, vamos a ver una salida como la siguiente:
Output
Observe que la fila para Sammy
shark
ahora ha desaparecido, y sólo Jamie
cuttlefish
sigue.,
Paso 5-Usando con instrucciones para limpieza automática
en este tutorial, hemos utilizado dos objetos primarios para interactuar con la base de datos "aquarium.db"
SQLite: a Connection
objeto llamado connection
, y a Cursor
objeto llamado cursor
.
de la misma manera que los archivos Python deben cerrarse cuando terminemos de trabajar con ellos, Connection
y Cursor
los objetos también deben cerrarse cuando ya no sean necesarios.,
se puede usar un with
instrucción para ayudarnos a cerrar automáticamente Connection
y Cursor
objetos:
closing
es una función de confort proporcionado por el contextlib
módulo. Cuando un with
declaración de salidas, closing
hace close()
se llama en cualquier objeto que se le pasa. La función closing
se usa dos veces en este ejemplo., Una vez para asegurarse de que el Connection
objeto devuelto por sqlite3.connect()
se cierra automáticamente, y una segunda vez para asegurarse de que el Cursor
objeto devuelto por connection.cursor()
se cierra automáticamente.,
Si ejecutamos este código, vamos a ver una salida como la siguiente:
Output
Desde "SELECT 1"
es una instrucción SQL que siempre devuelve una sola fila con una columna con un valor de 1
, tiene sentido ver una sola tupla con la etiqueta 1
como su único valor devuelto por nuestro código.
conclusión
el módulosqlite3
es una parte poderosa de la biblioteca estándar de Python; nos permite trabajar con una base de datos SQL en disco con todas las funciones sin instalar ningún software adicional.,
en este tutorial, aprendimos cómo usar el módulo sqlite3
para conectarse a una base de datos SQLite, agregar datos a esa base de datos, así como leer y modificar datos en esa base de datos. En el camino, también aprendimos sobre los riesgos de los ataques de inyección SQL y cómo usar contextlib.closing
para llamar automáticamente close()
en objetos Python en with
instrucciones.
desde aquí podemos aprender más acerca de las bases de datos SQL en SQLite vs MySQL vs PostgreSQL: a Comparison of Relational Database Management Systems.