12 Python - Bases de Datos I
12 Python - Bases de Datos I
LENGUAJE SQL
Un Motor de base de datos es el servicio principal para almacenar, procesar y proteger los datos. Proporciona
acceso controlado y procesamiento de transacciones rápido para correr aplicaciones que necesiten acceder,
recuperar y modificar datos de bases de datos.
• MySQL
• PostgreSQL
• SQLite
• SQL Server
• Oracle
¿Qué significa SQL y por qué la mayoría lo lleva en su nombre? El lenguaje más utilizado en las bases de datos
relacionales el lenguaje SQL (Lenguaje de Consulta Estructurada), todos estos motores de búsqueda utilizan una
sintaxis similar. Por lo tanto, si bien nosotros trabajaremos con SQLite, lo que aprendamos aquí para este motor en
Python será prácticamente igual o muy similar si programás para alguno de los demás motores.
Para interactuar con una base de datos desde Python es necesario, en primer lugar, tener instalado el módulo
correspondiente. Cada uno de los motores de bases de datos suele tener un módulo oficial y otros desarrollados por
la comunidad. Nosotros usaremos el módulo para sqlite llamado sqlite3 y que se encuentra entre los módulos de la
librería Standard de Python.
Para conectarnos a la base de datos y poder trabajar en ella, necesitamos poder conectarnos y lo segundo que
necesitamos es tener una base de datos a la cual conectarnos. Para la mayoría de los motores si queremos crear una
base de datos local para hacer pruebas, deberemos, además del módulo de Python, instalar el motor de base de
datos correspondiente (es decir, descargar e instalar MySQL, o PostgreSQL, u Oracle, etc.). Se dice por esto que las
bases de datos de programan utilizando la modalidad “cliente-servidor”. La única excepción para esto es SQLite que,
por ser muy pequeño y trabajar con archivos en el sistema, ya está incorporado en Python.
1. importar el módulo sqlite3. Es un módulo de la librería standard, por lo tanto no hace falta instalarlo
2. conectarnos a la base de datos. Para ello creamos un objeto y lo nombramos como hacemos cuando
almacenamos los diferentes tipos de datos. También nombramos un archivo en donde estará almacenada la base
de datos. La primera vez que ejecutamos nuestro script se creará el archivo. Si no especificamos un directorio se
creará en la misma carpeta en la que tenemos grabado nuestro programa. La extensión del archivo puede ser
.db o .sqlite3 entre otras.
3. crear un cursor que nos permita interactuar con la base de datos. El cursor es el objeto que nos permitirá realizar
cambios en la base de datos, como crear tablas, ejecutar consultas, agregar o borrar datos. También lo podemos
nombrar como queramos, al igual que las variables.
4. cerrar la conexión al finalizar el programa. Si no lo hacemos el archivo quedará abierto, lo que da lugar a que
pueda corromperse.
Guía 12: Python - Profesora Mariángeles Glavina
import sqlite3
conexion = sqlite3.connect('ejemplo.db')
mi_cursor = conexion.cursor()
conexion.close()
Como dijimos, para interactuar con la base de datos, crear tablas, modificarlas, realizar consultas necesitamos utilizar
el cursor. En el ejemplo anterior lo habíamos nombrado mi_cursor.
Uno de ellos es el método execute() que permite realizar diferentes operaciones por ejemplo, utilizar la instrucción
CREATE de SQL para crear una tabla:
La instrucción anterior crea una tabla, llamada personas con dos campos para el nombre (de tipo texto) y para la edad
(de tipo numérico)
Cuando una consulta realiza una modificación (cláusulas como CREATE, INSERT, UPDATE , DELETE , etc.) en la
información o estructura de alguna tabla de la base de datos es necesario “guardar los cambios” a través de una
operación llamada commit y que en Python se realiza a través de la función homónima: conexion.commit()
Si la conexión se cierra y no se ha llamado a la función commit() , toda consulta que haya alterado la base de datos
habrá sido desestimada.
import sqlite3
conexion = sqlite3.connect('ejemplo.db')
mi_cursor = conexion.cursor()
mi_cursor.execute("CREATE TABLE personas (nombre TEXT, edad NUMERIC)")
conexion.commit()
conexion.close()
Observemos además que si la tabla ya existe, el programa da error. Por lo tanto, deberíamos usar algunas
instrucciones más para evitar el error. Se podría evitar con un if, o mejor aún con una excepción, que es una
estructura condicional expecífica para cuando hay errores de diferentes tipos. En las próximas guías veremos los
errores más comunes y como evitarlos utilizando excepciones.
import sqlite3
conexion = sqlite3.connect('ejemplo.db')
mi_cursor = conexion.cursor()
try:
mi_cursor.execute("CREATE TABLE personas (nombre TEXT, edad NUMERIC)")
conexion.commit()
except:
pass
conexion.close()
Para agregar datos en una tabla, vamos a crear una tupla llamada datos. Las tuplas son conjunto de datos separados
por comas, que son inmutables, o sea, no puedo alterar parte de su contenido.
Guía 12: Python - Profesora Mariángeles Glavina
datos= ("Pablo", 30)
conexion.commit()
import sqlite3
conexion = sqlite3.connect('ejemplo.db')
mi_cursor = conexion.cursor()
try:
mi_cursor.execute("CREATE TABLE personas (nombre TEXT, edad NUMERIC)")
conexion.commit()
except:
pass
datos= ("Pablo", 30)
mi_cursor.execute("INSERT INTO personas VALUES (?, ?)", datos)
conexion.commit()
conexion.close()
También podemos insertar varios datos a la vez creando una tupla que contenga otras tuplas con la estructura
(nombre, edad) , y luego para cada una de ellas ejecutaremos una consulta INSERT para añadirla a la tabla.
conexion.commit()
Además podemos permitirle al usuario que ingrese esos datos por pantalla
import sqlite3
conexion = sqlite3.connect('ejemplo.db')
mi_cursor = conexion.cursor()
try:
mi_cursor.execute("CREATE TABLE personas (nombre TEXT, edad NUMERIC)")
conexion.commit()
except:
pass
nombre=input("Ingrese el nombre de la persona: ")
edad=int(input("Ingrese la edad de la persona: "))
mi_cursor.execute("INSERT INTO personas VALUES (?, ?)", (nombre, edad))
conexion.commit()
conexion.close()
Para obtener todos los datos de una tabla se utilizan las siguientes instrucciones:
todos = mi_cursor.fetchall()
print(todos)
Esto imprime en pantalla un lista de tuplas con todos los registros que contiene la tabla, por ejemplo:
print(mi_cursor.fetchone())
El valor de retorno de esta función es una tupla, no una lista, ya que solo obtiene una fila de la tabla especificada. En
este caso, imprime por ejemplo:
('Pablo', 30)
Y si volvemos a ejecutar la instrucción, imprimirá la siguiente fila, y así sucesivamente. Del mismo modo, el valor de
retorno puede ser None si la tabla está vacía o si la consulta no devolvió ningún resultado.
EJERCICIOS
1- CREAR UNA BASE DE DATOS QUE CONTENGA UNA TABLA CON AL MENOS TRES CAMPOS (UNO DEBE SER
NUMÉRICO) Y CARGAR 5 REGISTROS DESDE EL CÓDIGO.
2- EN LA TABLA ANTERIOR AGREGAR REGISTROS INGRESADOS POR EL USUARIO, MIENTRAS QUE EL USUARIO LO
REQUIERA