Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Este documento forma parte del curso Programación con Python del CEFIRE CTEM.
ÍNDICE
1.- Introducción
2.1.- Selección
2.2.- Inserción
2.3.- Actualización
2.4.- Borrado
Página 1
Programación en Python - Sesión 6: Acceso a Bases de Datos desde Python
1.- Introducción
En la Sesión anterior veíamos que era una Base de Datos, conocíamos las características
generales del SGBD MySQL y hemos sido capaces de generar en el Diseño Físico, un
escript en el que se encontraban las instrucciones DDL para crear una Base de Datos.
Ahora, estamos en condiciones de utilizar el lenguaje python para manipular los
datos existentes en una Base de Datos MySQL.
Operaciones de
Manipulación de Datos
Aunque utilizaremos python para acceder a las Bases de Datos MySQL, sin embargo es
necesario conocer las características del lenguaje DML (Data Manipulation
Language), que es en última instancia el lenguaje que interactúa con el SGBD MySQL.
Recordemos que el DML junto con el DDL forman parte del lenguaje SQL.
Página 2
Programación en Python - Sesión 6: Acceso a Bases de Datos desde Python
En este punto vamos a entrar en el detalle de cuales son las principales características
del Lenguaje DML, en relación a las 4 operaciones básicas: Selección (Select),
Inserción (Insert), Actualización (Update) y Borrado (Delete).
Vamos a ver la sintaxis de cada una de estas operaciones, aunque solo abordaremos las
características más importantes ya que abordarlas todas excedería los objetivos del
Curso.
2.1.- Selección
Instrucción SELECT
Esta instrucción nos permite seleccionar filas de una o más tablas. Por un lado,
indicaremos las columnas que deseamos obtener, con lo cual estaremos realizando
un filtro vertical o proyección de los datos de la tabla de la cual queremos seleccionar
los registros. Por otra parte, realizaremos un filtro horizontal, seleccionando sólo
aquellos registros o filas que cumplen una determinada condición.
Sintaxis:
Aunque vamos a poder seleccionar datos de más de una Tabla, sin embargo esta
característica la dejaremos para el último apartado de este punto. Ahora solo nos
centraremos en seleccionar datos de una sola Tabla.
Vemos como esta instrucción tiene 4 Secciones diferenciadas: Select …, From …,
Where … y Order By …. Las 2 primeras son obligatorias, mientras que las 2 últimas son
opcionales.
Página 3
Programación en Python - Sesión 6: Acceso a Bases de Datos desde Python
C1 C2 C3 C4 C5
… … … … ...
… … … … ...
Si no queremos hacer ningún filtro pondremos la lista de todos las columnas existentes en
la Tabla, aunque también existe la posibilidad de utilizar el carácter comodín *, lo cual
indica que queremos seleccionar todas las columnas.
Select * From …
Página 4
Programación en Python - Sesión 6: Acceso a Bases de Datos desde Python
C1 C2 C3 C4 C5
… … … … ...
… … … … ...
Vemos como aparecen resaltados en otro color, únicamente los Registros que cumplen la
condición y por por tanto los que son seleccionados.
Cada una de las condiciones estará formada por un patrón similar al que veríamos en las
instrucciones condicionales en python.
Página 5
Programación en Python - Sesión 6: Acceso a Bases de Datos desde Python
En el caso de que utilicemos más de una condición, las separaremos mediante los
operadores lógicos (AND y OR), igual que hacíamos en python cuando teníamos una
condición compuesta, es decir formada por más de un término o subcondición.
Recordemos como se formaban este tipo de Condiciones Compuestas:
A su vez cada Subcondición estaba formada por la misma estructura con la que
formábamos las condiciones:
Subcondición
Página 6
Programación en Python - Sesión 6: Acceso a Bases de Datos desde Python
A continuación podemos ver como se han seleccionado las columnas C1, C3 y C4,
solo de determinados Registros:
C1 C2 C3 C4 C5
… … … … ...
Ejemplos:
SELECT * From Empleado Where Where Salario > 1000 OR Tipo_Empleado = ‘F’
SELECT Num_Pedido, Estado_Pedido, Importe_Pedido FROM Pedido Where
Importe_Pedido >= 200 AND Estado_Pedido = ‘S’
En el primer ejemplo seleccionamos todas las columnas de la Tabla Empleado pero solo
de aquellos Empleados cuyo Salario sea mayor de 1.000 € o que sean Fijos (‘F’).
Mientras que en el segundo ejemplo, seleccionamos solo 3 columnas de la Tabla Pedido,
solo de aquellos Pedidos cuyo importe sea mayor o igual a 200 € y que además se
encuentren Servidos (‘S’).
Finalmente la última Sección ORDER BY nos permite ordenar los Registros que
obtenemos como resultado de la consulta de forma ascendente (ASC) o
descendente (DESC). Si no indicamos la forma de ordenación, por defecto será
Ascendente. A continuación de la cláusula ORDER BY indicamos la columna por la que
deseamos que se produzca la ordenación.
Página 7
Programación en Python - Sesión 6: Acceso a Bases de Datos desde Python
Ejemplos:
2.2.- Actualización
Instrucción UPDATE
Esta instrucción nos permite actualizar en una Tabla los datos de una o más columnas,
la actualización afectará a tantas filas como seleccionemos en el Where. La forma de
expresar el Where es exactamente igual que con la Instrucción SELECT.
Sintaxis:
Tenemos que tener cuidado con esta instrucción, ya que como podemos observar en la
Sintaxis de arriba, la Sección Where es opcional, de manera que si no se incluye, la
actualización afectará a todos los Registros de la Tabla. De igual modo, si los
registros seleccionamos en el Where no son los que queríamos, la actualización
también puede afectar a Registros no deseados.
La forma de expresar el nuevo valor de la columna puede ser mediante una simple
constante o bien con una sencilla fórmula, en la cual normalmente se suelen emplear los
operadores aritméticos. A continuación podemos ver algunos ejemplos:
UPDATE Empleado SET Salario = Salario + (Salario * 0.1) Where Salario < 1000
UPDATE Empleado SET Nombre = ‘José García López’, Poblacion = ‘Valencia’
Página 8
Programación en Python - Sesión 6: Acceso a Bases de Datos desde Python
2.3.- Inserción
Instrucción INSERT
Esta instrucción nos permite insertar nuevos Registros en una Tabla.
Sintaxis:
Página 9
Programación en Python - Sesión 6: Acceso a Bases de Datos desde Python
Ejemplos:
2.4.- Borrado
Instrucción DELETE
Esta instrucción nos permite borrar los Registros existentes en una Tabla. Con esta
instrucción igual que con la instrucción UPDATE hay que tener cuidado, ya que
podemos borrar de forma accidental Registros que no queremos borrar sobre todo
si la Sección opcional del Where no la incluimos, ya que ese caso se borarían todos
los Registros de la Tabla.
Sintaxis:
Ejemplos:
Vamos a ver una variante de la instrucción de Selección que nos permite obtener
Registros de más de una Tabla. Cuando queremos seleccionar los Registros de más de
una Tabla, la condición que se tiene que cumplir es que las Tablas implicadas tienen
que estar relacionadas entre sí a través de Claves Ajenas.
Página 10
Programación en Python - Sesión 6: Acceso a Bases de Datos desde Python
EMPLEADO
DEPARTAMENTO
Num_Empleado
Nombre Cod_Dept
Direccion Nom_Departamento
Fecha_Alta Num_Empleados
Salario
Cod_Dept
Tabla Padre
Tabla Hija
vemos que siempre ocurre que una columna actúa de Clave Ajena (Cod_Dept en
EMPLEADO) en la Tabla Hija y otra columna es la Clave Primaria (Cod_Dept en
DEPARTAMENTO) en la Tabla Padre.
Bien, por lo que respecta a la instrucción SELECT, en primer lugar tenemos que
especificar el nombre de las Tablas que intervienen en la Consulta separadas por
comas, en la Sección FROM. Además, por cada par de Tablas Relacionadas tenemos
que expresar esta Relación, la forma de hacerlo consiste en añadir una condición en la
Sección WHERE, la cual estará forma de la siguiente manera:
Columna_Tabla_Hija = Columna_Tabla_Padre
Esta relación expresada de esta forma en la Sección Where se le conoce como JOIN
de la 2 Tablas Relacionadas.
Esto quiere decir que para que un Registro sea seleccionado y forme parte del conjunto
de Registros resultantes de la Consulta, el valor de estas 2 Columnas tiene que coincidir.
Página 11
Programación en Python - Sesión 6: Acceso a Bases de Datos desde Python
Cuando tenemos Consultas con más de una Tabla, es bastante aconsejable utilizar
ALIAS para los nombres de las Tablas, ya que con el ALIAS eliminamos al
ambigüedad que pueda existir en el nombre de las Columnas cuando indicamos el
JOIN de cada par de Tablas Relacionadas. El ALIAS que ponemos a cada Tabla hay que
indicarlo en la Sección FROM a continuación del nombre de cada Tabla.
Si utilizamos ALIAS, a la hora de referirnos a las Columnas tanto en la Sección WHERE
como en la Sección SELECT, tenemos que calificar las Columnas anteponiendo el
nombre del Alias más un punto (.) al nombre de la Columna en cuestión.
Alias1 . Nombre_Columna1
Ejemplo:
Vemos que como nombre de Alias, se suele utilizar un único carácter que a ser posible
coincidirá con la letra inicial de la Tabla en cuestión. Por ejemplo, E para Empleado y D
para Departamento.
Página 12
Programación en Python - Sesión 6: Acceso a Bases de Datos desde Python
Sintaxis:
Página 13
Programación en Python - Sesión 6: Acceso a Bases de Datos desde Python
En primer lugar para poder acceder a MySQL desde python 3, tenemos que instalar el
paquete python3-mysqldb, puesto que no viene instalado por defecto en python.
Podemos hacerlo desde el Gestor de Paquetes Synaptic, buscando el paquete python3-
mysqldb seleccionándolo para instalar y aplicamos o bien desde la consola de Sistema
tecleando el siguiente comando:
import MySQLdb
...
Bien una vez que tenemos instalado el Módulo que nos permitirá acceder a las Bases de
Datos MySQL, comentaremos que en cierto modo la utilización de una Base de Datos
desde python es parecido al manejo de un fichero, en el sentido de que tendremos
un manejador que nos permitirá comunicarnos con la Base de Datos para lanzar las
Página 14
Programación en Python - Sesión 6: Acceso a Bases de Datos desde Python
Programa Python
Base de Datos
import MySQLdb
MySQL
...
# Creamos el manejador
# de la conexión
conexion = ... conexion
Establecemos la conexión
...
Programa
= Lanzamos Operaciones contra
la Base de Datos y tratamos
Python los Resultados
...
Cerramos la conexión
Como primer paso lo tenemos que hacer es crear el objeto manejador de la conexión
a la Base de Datos MySQL, para lo cual utilizaremos la función connect(...) del Módulo
MySQLdb que usaremos del modo que aparece en la siguiente página.
Página 15
Programación en Python - Sesión 6: Acceso a Bases de Datos desde Python
b
nombre_manejador = MySQLdb.connect(host, usuario, contraseña, base_datos)
usuario => en este parámetro especificaremos con que usuario nos conectamos a la
Base de Datos. El valor que indicaremos es root, puesto que en nuestro caso es el
único usuario que hay creado en MySQL
Ejemplo:
import MySQLdb
…
manejador_bdd = MySQLdb.connect(”localhost”, “root”, “1234”,
“gestion_personal”)
# Ahora ya tenemos creado el manejador y por tanto a través del mismo,
# tenemos accesible la Base de Datos gestion_personal
...
Como segundo paso, a partir del manejador creado en el primer paso, crearemos un
objeto de tipo cursor, el cual nos permitirá lanzar o ejecutar todo tipo de operación DML
Página 16
Programación en Python - Sesión 6: Acceso a Bases de Datos desde Python
contra la Base de Datos. Para poder hacerlo disponemos del método cursor()
asociado al objeto manejador que usaremos del siguiente modo:
nombre_cursor = nombre_objeto_manejador.cursor()
Bien, comentaremos que los Cursores son mecanismos utilizados en los lenguajes de
programación que utilizan Bases de Datos, para poder manejar o gestionar la
información la información que responde el SGBD al programa en cuestión. Sobre todo se
hace evidente su utilidad cuando lanzamos una Consulta al SGBD, puesto que
cuando éste responde con los Registros seleccionados en la consulta, éstos se
almacenan en lo que se conoce con el nombre de Área de Intercambio o Área de
Memoria Intermedia.
El siguiente esquema representa este concepto:
Programa SGBD
Python MySQL
Procesamiento de los
Resultado de la Consulta
Registros devueltos por
la Consulta
Área de Intercambio
En el tercer paso, una vez que tenemos instanciado el objeto de tipo cursor, estamos en
condiciones de lanzar operaciones DML contra la Base de Datos, para lo cual
utilizaremos el método execute(...), asociado al objeto de tipo cursor.
Página 17
Programación en Python - Sesión 6: Acceso a Bases de Datos desde Python
numero_registros = cursor_bdd.execute(operacion_DML[,parametros_de_sustitucion])
El primer parámetro, operacion_DML, será una cadena de texto donde estará indicada
cual es la operación DML que vamos a lanzar.
El segundo parámetro es opcional y lo veremos después, pero antes vamos a ver un
ejemplo completo en el que se produce la conexión a la Base de Datos gestion_personal
y el lanzamiento de una Consulta (Select).
import MySQLdb
cursor_bdd = manejador_bdd.cursor()
cadena_select = “Select * from EMPLEADO”
num_empleados = cursor_bdd.execute(cadena_select)
if num_empleados > 0:
print(“Se han recuperado Registros de la Tabla EMPLEADO”)
else:
print(“NO se han recuperado Registros de la Tabla EMPLEADO”)
cursor_bdd.close()
manejador_bdd.close()
Página 18
Programación en Python - Sesión 6: Acceso a Bases de Datos desde Python
Además, en la cadena que contiene la instrucción Select, tendremos que indicar con
los caracteres %s todos aquellos puntos, en los que se tiene que producir la
sustitución del valor del segundo parámetro por %s.
import MySQLdb
cursor_bdd = manejador_bdd.cursor()
cod_dept = int(input(“Introduce un Código de Departamento: ”))
cadena_select = “Select * from DEPARTAMENTO Where Cod_Dept = %s”
parametros = (cod_dept,)
num_deptartamentos = cursor_bdd.execute(cadena_select, parametros)
if num_deptartamentos > 0:
Página 19
Programación en Python - Sesión 6: Acceso a Bases de Datos desde Python
cursor_bdd.close()
manejador_bdd.close()
...
cadena_select = “Select * from EMPLEADO Where Cod_Dept = %s and Salario >
%s”
parametros = (departamento, salario, )
num_empleados = cursor_bdd.excute(cadena_select, parametros)
...
Página 20
Programación en Python - Sesión 6: Acceso a Bases de Datos desde Python
...
cadena_select = “Select * from EMPLEADO”
num_empleados = cursor_bdd.execute(cadena_select)
if num_empleados > 0:
# Recorremos el cursor
for registro in cursor_bdd:
print(“Nombre:”,registro[1],”- Salario:” + str(registro[4]) + ”\n”)
else:
print(“NO Existen Empleados”)
...
Vamos a poner otro ejemplo, suponemos que hemos realizado una Consulta sobre la
Tabla Empleado en la que se han seleccionado 3 columnas: Nombre, Salario y
Departamento y no hemos puesto ningún filtro horizontal, es decir se han
seleccionado todos los Empleados. Si en la Tabla hay 4 Empleados, la Lista de Primer
Nivel contendrá 4 elementos, a su vez cada uno de estos 4 elementos será una lista
de 3 elementos.
Los valores del Cursor serían los siguientes:
cursor_bdd = [ [ ‘José García’, 1800, 30 ], [ ‘María Fernández’, 2000, 20 ], [ ‘Carlos
Gil’, 1200, 30 ], [ ‘Amparo Gutiérrez’, 1500, 10 ] ]
Página 21
Programación en Python - Sesión 6: Acceso a Bases de Datos desde Python
Finalmente veremos el método fetchone() del objeto de tipo cursor(…), el cual nos
permite recuperar del Área de Memoria Intermedia o Estructura de Datos del Cursor
los datos de un Registro, pudiendo almacenarlos en una variable de tipo Lista. En el
Cursor de forma parecida a como veíamos en los Ficheros, existe un puntero o marca
que nos apunta o señala cual es el Registro Actual, de manera que el Registro
recuperado por el método fetchone(), será el Registro Actual. Cada vez que ejecutamos
este método, el puntero o marca se desplaza apuntando al siguiente Registro.
Este método puede ser útil, cuando recuperamos por ejemplo los datos de un
Registro concreto de una Tabla y queremos mostrar su contenido, en este caso, no
tiene mucho sentido montar un bucle para iterar sobre el cursor, ya que solamente hemos
recuperado un Registro. A continuación mostramos un ejemplo:
…
num_empleado = int(input(“Introduce un Número de Empleado: ”))
cadena_select = “Select * from EMPLEADO Where Num_Empleado = %s”
parametros = (num_empleado, )
num_empleados = cursor_bdd.excute(cadena_select, parametros)
if num_empleados > 0:
# Mostramos el Nombre y el Salario del Empleado
registro = cursor_bdd.fetchone()
print(“Nombre:”,registro[1],”- Salario:” + str(registro[4]) + ”\n”)
else:
print(“NO Existen Empleados”)
...
Para acabar, aunque ya ha aparecido en los ejemplos que hemos visto, vamos a
comentar el método close(). Se aplica tanto al objeto de tipo cursor como al objeto
de tipo manejador de la Base de Datos, es aconsejable y recomendable ejecutar
este método antes de finalizar el programa, en todos los cursores que tengamos
Página 22
Programación en Python - Sesión 6: Acceso a Bases de Datos desde Python
cursor_bdd.close()
manejador_bdd.close()
Página 23
Programación en Python - Sesión 6: Acceso a Bases de Datos desde Python
Precio
Cod_Almacen
Cod_Familia
Página 24
Programación en Python - Sesión 6: Acceso a Bases de Datos desde Python
de las columnas. Estos valores estarán validados, con lo cual podremos insertar el
registro en la Tabla ARTICULO.
En la función introduce_datos_articulo(), se introducirán los valores asociados a cada
una de las 6 columnas de la Tabla Articulo, tendremos funciones a parte que realizarán el
control sobre los datos que sean susceptibles de que se realice algún tipo de
comprobación.
La lista de funciones que debemos emplear para realizar este control, así como los
parámetros que reciben y el dato que devuelven se enumeran a continuación:
Página 25
Programación en Python - Sesión 6: Acceso a Bases de Datos desde Python
Listar Artículos
Esta opción de Menú llamara la función lista_articulos(manejador_bdd) a la cual se le
pasará como parámetro el manejador de la Base de Datos.
La función realizará una Operación de Consulta sobre las 3 Tablas: Articulo, Almacen y
Familia, listando el contenido de la mismas por pantalla. El formato que debe de presentar
el listado se muestra a continuación:
LISTADO DE ARTÍCULOS
Página 26
Programación en Python - Sesión 6: Acceso a Bases de Datos desde Python
Salir
Esta opción dará por finalizada la ejecución del programa.
A continuación, se indica como debería ser el esqueleto del programa para realizar esta
actividad obligatoria.
# Zona de imports
...
# Definición de las Funciones que se utilizarán en el Programa Principal
def es_referencia_valida(...):
…
def es_stock_valido(...):
…
def es_precio_valido(…):
…
def es_almacen_valido(…):
…
def es_familia_valida(…):
…
def introduce_datos_articulo():
…
def lista_articulos(...):
…
# Programa Principal
# Creación del objeto manejador de la Base de Datos
…
# Gestión del menú
…
while …:
# Análisis de la opción de menú seleccionada
Página 27
Programación en Python - Sesión 6: Acceso a Bases de Datos desde Python
...
introduce_datos_articulo():
...
lista_articulos(...)
Página 28