Está en la página 1de 29

Programación en Python - Sesión 6: Acceso a Bases de Datos desde Python

Sesión 6. Acceso a Bases de Datos desde


Python

Este documento forma parte del curso Programación con Python del CEFIRE CTEM.

Esta obra está sujeta a la licencia Reconocimiento-NoComercial-CompartirIgual 4.0 Internacional


de Creative Commons. Para ver una copia de esta licencia, visitad
http://creativecommons.org/licenses/by-nc-sa/4.0/.

Autoria: José Luis Tomás Navarro.


Programación en Python - Sesión 6: Acceso a Bases de Datos desde Python

ÍNDICE

1.- Introducción

2.- Lenguaje DML

2.1.- Selección

2.2.- Inserción

2.3.- Actualización

2.4.- Borrado

2.5.- Selección con varias Tablas

3.- Conexión desde Python a MySQL

4.- Actividad Obligatoria

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.

Programa Base de Datos Tabla A Tabla B


Python 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.

SQL = DDL + DML

Bajo el nombre genérico de Manipulación de Datos, podemos englobar las siguientes


operaciones:
- Selección Registros => Select …
- Introducción de nuevos Registros => Insert ...
- Actualización de la información existente en los Registros => Update …
- Borrado de Registros Existentes => Delete ...

Página 2
Programación en Python - Sesión 6: Acceso a Bases de Datos desde Python

2.- Lenguaje DML

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:

SELECT Nombre_Col1 [, Nombre_Col2 ,...]

FROM Nombre_Tabla1 [,Nombre_Tabla2 ...]

[WHERE Condicion1 [ operador_lógico Condicion2, …], ...]

[ORDER BY Nombre_Columna1 [ASC/DESC] [, Nombre_Columna2


[ASC/DESC] ] ...]

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

En la primera Sección, cuando realizamos un Filtro Vertical o Proyección


seleccionamos solo aquellas columnas de la Tabla que nos interesan, para lo cual
pondremos el nombre de las columnas separadas por comas, a continuación de la
palabra SELECT.
A continuación mostraremos un ejemplo genérico y otro particular.

Select C1, C3, C4 From …

C1 C2 C3 C4 C5

… … … … ...

Select Cod_Empleado, Salario, Fecha_Alta From …

Cod_Empleado Nombre Salario Fecha_Alta Direccion

… … … … ...

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 …

En la segunda Sección indicaremos la Tabla de la cual queremos obtener la información,


para lo cual, a continuación de la palabra FROM especificamos el nombre de la
Tabla. Ejemplos:

Select * From Empleado

Página 4
Programación en Python - Sesión 6: Acceso a Bases de Datos desde Python

SELECT Num_Factura, Fecha_Factura FROM Factura

La tercera Sección es opcional y nos permite la posibilidad de indicar un Filtro


Horizontal o Selección. Para lo cual, utilizaremos la palabra Where de manera que a
continuación de la misma, indicaremos la condición que queremos que cumplan los
registros para que sean seleccionados. Ejemplos:

SELECT * From Nombre_Tabla Where ...

C1 C2 C3 C4 C5

… … … … ...

SELECT * From Empleado Where ...


SELECT Num_Factura, Fecha_Factura FROM Factura Where ...

Cod_Empleado Nombre Salario Fecha_Alta Direccion

… … … … ...

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.

Columna o Constante Operador Relacional Columna o Constante

Página 5
Programación en Python - Sesión 6: Acceso a Bases de Datos desde Python

La única diferencia estriba en los operadores relacionales que podemos utilizar,


tendremos los siguientes: <, >, <=, >=, = y <>, como podemos observar, python utiliza
como operador distinto != en lugar de <>.
Ejemplos:

SELECT * From Empleado Where Where Salario > 1000

SELECT * Where Anyo_Factura = 2018

Cod_Empleado Nombre Salario Fecha_Alta Direccion


1200
… … 800 … ...
1800

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:

Subcondición 1 Operador Lógico Subcondición 2

A su vez cada Subcondición estaba formada por la misma estructura con la que
formábamos las condiciones:

Subcondición

Columna o Constante Operador Relacional Columna o Constante

Página 6
Programación en Python - Sesión 6: Acceso a Bases de Datos desde Python

También existe la posibilidad de realizar un filtro vertical + un filtro horizontal, con lo


cual seleccionamos determinadas columnas y añadimos un filtro where. En este caso
tenemos una proyección + una selección.

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:

SELECT * From Nombre_Tabla Where … ORDER BY nombre_columna DESC

Select * From Empleado ORDER BY Salario DESC


SELECT Num_Factura, Fecha_Factura FROM Factura Where Importe_Factura >
500 ORDER BY Fecha_Factura

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:

UPDATE Nombre_Tabla SET Nombre_Col1 = Valor1 [, <Nombre_Col2> =


<Valor2>, ...]

[WHERE Condicion1 [ operador_lógico Condicion2, …], ...]

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

Where Nombre = ‘José García’


UPDATE Articulo SET Precio = Precio + (Precio * 0.05)

En el primer ejemplo, aumentamos un 10 % el Salario solo a aquellos Empleados cuyo


Salario fuera menor de 1.000 €, vemos como hemos empleado una sencilla fórmula
aritmética para llevar a cabo al actualización del Salario. En el segundo ejemplo,
modificamos 2 columnas de un determinado Empleado, por una parte modificamosel
Nombre añadiéndole el segundo apellido y por otra modificamos la Población a Valencia.
Mientras que en el último ejemplo, subimos un 5% el precio de todos los Artículos, ya que
como podemos comprobar no existe la Sección Where.

2.3.- Inserción

Instrucción INSERT
Esta instrucción nos permite insertar nuevos Registros en una Tabla.

Sintaxis:

INSERT INTO Nombre_Tabla [(Nombre_Col1, …,Nombre_ColN)] VALUES


(valor_columna1,…,valor_columnaN)

De forma opcional podemos indicar de forma explícita el nombre de las columnas de


la Tabla, de manera que si hacemos esto así, tenemos que proporcionar un valor a todas
las columnas, incluidas las que pueden tomas valo Nulo, en las cuales debemos poner el
valor NULL.
Si no indicamos el nombre de las columnas, en la Sección VALUES, tenemos que
suministrar valores para todas la columnas de la Tabla que no puedan tomar valor
Nulo. De manera que el primer valor de VALUES se corresponderá con la primera
Columna de la Tabla que no puede tomar valor Nulo (normalmente será la Clave
Primaria), el segundo valor de VALUES con la segunda Columna que no puede tomar
valor Nulo y así sucesivamente.

Página 9
Programación en Python - Sesión 6: Acceso a Bases de Datos desde Python

Ejemplos:

INSERT INTO Empleado(Cod_Empleado, Nombre, Direccion, Salario) VALUES


(1000, ’Carlos Gil’, null, 1800)
INSERT INTO Departamento VALUES (10, ’Comercial’, 4)

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:

DELETE FROM Nombre_Tabla [WHERE <Condicion1> [ <op_lógico>


<Condicion2>, …], ...]

Ejemplos:

DELETE FROM Empleado Where Cod_Empleado = 540


DELETE FROM Articulo Where Stock = 0

En el primer ejemplo, borramos el Empleado cuoy Código es 540, mientras que en el


segundo ejemplo borraremos todos aquellos Artículos cuyo Stock sea 0.

2.5.- Selección con varias Tablas

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

Si nos fijamos en un Diagrama Relacional en el que hay 2 Tablas que se encuentran


relacionadas entre sí, como por ejemplo Empleado y Departamento:

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

Es muy importante incluir este JOIN de las 2 Tablas en el WHERE, ya que de no


hacerlo, los Registros obtenido en la Consulta no serán correctos. Si NO incluimos
el JOIN en la Sección WHERE, en la Consulta obtendremos el Producto Cartesiano
de las 2 Tablas, es decir el primer Registro de la primera Tabla, con todos los Registros
de la segunda Tabla, el segundo Registro de la primera Tabla a su vez con todos los
Registros de la Segunda Tabla y así sucesivamente.

Lógicamente en la Sección WHERE además de las condiciones necesarias para el


JOIN de las Tablas Relacionadas, también pueden existir Filtros Horizontales (otras
condiciones) en cada una de las Tablas que seleccionen solo aquellos Registros que nos
interesen.

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:

Select … FROM Empleado E, Departamento D Where E.Cod_Dept =


D.Cod_Dept ...

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:

Select ... FROM Nombre_Tabla1 Alias1, Nombre_Tabla2 Alias2, … Where

Alias1.Nombre_Columna1 = Alias2.Nombre_Columna1 ...

A continuación, mostramos algunos ejemplos de Consultas con JOIN, donde también


podemos ver la utilización de ALIAS.

Select E.Nombre, E.Salario, D.Nom_Departamento


From Empleado E, Departemento D
Where E.Cod_Dept = D.Cod_Dept
==================================================================
Select E.Num_Empleado, E.Nombre, E.Salario, D.Nom_Departamento
From Empleado E, Departemento D
Where E.Cod_Dept = D.Cod_Dept and E.Salario > 1000
Order By E.Salario DESC
==================================================================
Select P.Num_Pedido, P.Importe_Pedido, C.Nom_Cliente
From Pedido P, Cliente C
Where P.Cod_Cliente = C.Cod_Cliente
Order By P.Num_Pedido

Página 13
Programación en Python - Sesión 6: Acceso a Bases de Datos desde Python

3.- Conexión desde Python a MySQL

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:

sudo apt-get install python3-mysqldb

Tras lo cual, si todo ha ido bien nos aparecerá la siguiente pantalla:

En cada programa python en el que queramos conectarnos a MySQL, utilizaremos el


Módulo MySQLdb, haciendo el import correspondiente al principio del programa:

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

operaciones que necesitemos realizar sobre la misma y poder intercambiar información


con el programa python. En el siguiente esquema se representa esta idea:

Programa Python
Base de Datos
import MySQLdb
MySQL
...
# Creamos el manejador
# de la conexión
conexion = ... conexion

Además, el esquema de funcionamiento de los programas python que utilizan Bases de


Datos, también será similar al que utilizábamos para trabajar con ficheros:

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)

A continuación analizaremos cada uno de los parámetros de la función connect(...).


host => indicaremos el host en el que se encuentra el SGBD MySQL al cual nos
queremos conectar, normalmente indicaremos como valor localhost, ya que nos
conectaremos en local, es decir la Base de Datos MySQL se encuentra en el mismo
ordenador en el que está el programa python que se va ejecutar

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

contraseña => se corresponde con el valor de la contraseña del usuario especificado en


el anterior parámetro, en nuestro caso la contraseña de root

base_datos => es el nombre de la Base de Datos a la que nos conectamos, de esta


manera al conectarnos implícitamente estamos haciendo un use base_datos.
Lógicamente debe existir porque de lo contrario se producirá un error.

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:

Orden DML (Consulta Select)

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

La sintaxis del método execute(...) es la siguiente:

numero_registros = cursor_bdd.execute(operacion_DML[,parametros_de_sustitucion])

Este método devolverá el número de registro implicados en la operación que ha sido


indicada en el primer parámetro (operacion_DML). Esta información es sobre todo útil
cuando lanzamos consultas, ya que de una forma sencilla podemos comprobar si
hay algún Registro que satisface la consulta lanzada.

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

manejador_bdd = MySQLdb.connect(”localhost”, “root”, “1234”,


“gestion_personal”)

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()

Vemos como se ha lanzado una Consulta sobre la Tabla EMPLEADO, en la que se


han seleccionado todas las columnas de la Tabla y todos los Registros existentes en

Página 18
Programación en Python - Sesión 6: Acceso a Bases de Datos desde Python

la misma. Posteriormente analizamos el contenido de la variable num_empleados, para


saber si hay Registros o no.

El segundo parámetro del método execute(…), se utiliza cuando en la operación


DML expresada en el primer parámetro, existe algún valor que depende de alguna
variable. De manera que este segundo parámetro se suele utilizar en las consultas
cuando por ejemplo, en la Sección Where el valor de una columna de la Tabla en
cuestión depende del valor de una variable, a la cual se le ha asignado anteriormente
un valor en el programa. La estructura que tiene este segundo parámetro
(parametros_de_sustitucion) es una tupla de datos, de manera que las variables
que incluyamos en este parámetro tenemos que indicarlas con la nomenclatura de
una tupla:
parametros = (variable1, variable2, ...).

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.

Todo esto se entenderá mejor con un ejemplo:


Imaginemos que solicitamos al usuario que introduzca por teclado un Código de
Departamento para comprobar si existe en la Base de Datos.

import MySQLdb

manejador_bdd = MySQLdb.connect(”localhost”, “root”, “1234”,


“gestion_personal”)

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

print(“El DEPARTAMENTO: ” + str(cod_dept) + “ SI que existe”)


else:
print(“El DEPARTAMENTO ” + str(cod_dept) + “ No existe”)

cursor_bdd.close()
manejador_bdd.close()

Tienen que aparecer tantos parámetros de sustitución en el segundo parámetro


(elementos de la Tupla), como lugares existen en la cadena del primer parámetro en
los que aparezcan los caracteres %s. En el siguiente ejemplo, en la cadena aparecen 2
veces y por tanto tendremos una tupla con 2 elementos:

...
cadena_select = “Select * from EMPLEADO Where Cod_Dept = %s and Salario >
%s”
parametros = (departamento, salario, )
num_empleados = cursor_bdd.excute(cadena_select, parametros)
...

La sustitución se produce de izquierda a derecha, de manera que el elemento 0 de la


tupla realizará la sustitución de más a la izquierda mientras que el último elemento
de la tupla llevará a cabo la sustitución de más a la derecha.

Si pensamos en operaciones de Consulta (Select), las cuales devuelven múltiples


Registros, vamos a ver en el cuarto paso, como podemos procesar esta
información. Recordemos que toda esta información, esta almacenada en un Área de
Intercambio, que está representada por el Cursor.
La forma más sencilla de procesar la información almacenada en un Cursor es
iterando con un bucle for sobre el mismo. En la siguiente página, se muestra un
ejemplo en el que se visualiza por pantalla, el Nombre y el Salario de todos los
Empleados existentes.

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”)
...

La estructura de datos interna en la que se almacena la información que contiene el


Cursor es una Lista, en la que a su vez cada elemento de la Lista de Primer Nivel es
una nueva Lista, es decir es una Lista de Listas. Existirán tantos elementos en la
Lista como Registros haya devuelto la Consulta. El número de elementos de cada
una de las Listas que forman parte de la Lista de Primer Nivel, coincidirá con el
número de Columnas seleccionadas en la Consulta. De manera que lógicamente
todas las Listas contarán con el número de elementos.
Como podemos ver en el ejemplo anterior, el elemento que contiene los datos de cada
iteración, es decir la variable registro, será una lista que contendrá las Columnas
seleccionadas en la Select. Por tanto, la variable registro en cada iteración contiene
cada una de las Listas de la Lista de Primer Nivel.

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”)
...

En el ejemplo anterior, seleccionamos los datos de un Número de Empleado introducido


por teclado, de manera que si existe mostramos su Nombre y el Salario.

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

abiertos y en el manejador de la conexión de la Base de Datos que estemos utilizando,


con el fin de liberar recursos y cerrar todas las conexiones con la Base de Datos.

cursor_bdd.close()
manejador_bdd.close()

Página 23
Programación en Python - Sesión 6: Acceso a Bases de Datos desde Python

4.- Actividad Obligatoria


Actividad Entrega Obligatoria: Base de Datos Gestión Artículos
En esta actividad obligatoria partiremos de la Base de Datos Gestion_Articulos creada
en la Sesión anterior, pero que tendrá una ligera modificación que consistirá en añadir
la columna Stock_Almacen en la Tabla Almacen. Esta nueva columna representará el
Stock Total existente en un determinado Almacén, es decir será la suma del Stock de
todos los Artículos existentes en dicho Almacén.
A continuación se muestra el Diagrama Relacional de la Base de Datos Gestión Almacen,
que será el mismo que veíamos en la Sesión anterior, solo que se le ha añadido la nueva
columna Stock_Almacen a la Tabla ALMACEN.

FAMILIA ARTICULO ALMACEN

Cod_Familia Referencia Cod_Almacen


Desc_Familia Desc_Articulo Nom_Almacen
Num_Articulos Stock Stock_Almacen

Precio
Cod_Almacen
Cod_Familia

En el programa principal habrá un menú que las siguientes opciones:


1.- Introducir Nuevos Artículos
2.- Listar Artículos
3.- Salir

A continuación, vamos a especificar el contenido de cada una de estas opciones.


Introducir Nuevos Artículos
En esta opción de llamará a la función Introduce_Datos_Articulo(), la cual retornará
una tupla con 6 valores que se corresponderán con los valores que debe tener cada una

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:

es_referencia_valida(referencia, conexion_bdd) => devolverá un booleano


A esta función se le pasará un dato numérico que será la Referencia el Artículo y el
manejador de la conexión a la Base de Datos. Se comprobará que este Artículo no haya
sido dado de Alta previamente, para lo cual realizará una Consulta SELECT sobre la Tabla
ARTICULO.
La función devolverá un valor True si la Referencia es válida, es decir no ha sido
dado de Alta con anterioridad y False en caso contrario.

es_stock_valido(stock) => devolverá un booleano


A esta función le pasaremos el stock como dato numérico y la función comprobará que
su valor se encuentre entre 0 y 200 ambos inclusive. Devolverá True si el Stock es
válido y False en caso contrario.

es_precio_valido(precio) => devolverá un booleano


Esta función recibirá como parámetro el precio del Artículo y comprobará que se
encuentre entre 1 y 2000 ambos inclusive. Devolverá True si el Precio es válido y
False en caso contrario.

es_almacen_valido(almacen, conexion_bdd) => devolverá un booleano


La función recibirá como parámetro el Código de Almacén y el manejador de la conexión,
comprobando si existe el Almacén, para lo cual realizará una Consulta Select en la Tabla
ALMACEN aplicando un filtro horizontal con el parámetro recibido. Devolverá True si el
Almacén existe y False en caso contrario.

Página 25
Programación en Python - Sesión 6: Acceso a Bases de Datos desde Python

es_familia_valida(familia, conexion_bdd) => devolverá un booleano


Esta función recibirá como parámetro el Código de Familia y el manejador de la conexión,
comprobando si existe la Familia, para lo cual realizará una Consulta Select en la Tabla
FAMILIA aplicando un filtro horizontal con el parámetro recibido. Devolverá True si la
Familia existe y False en caso contrario.

Una vez que la función introduce_datos_articulo() finaliza su ejecución el Programa


Principal contará con una Tupla de 6 valores, correspondientes a las 6 Columnas de
la Tabla ARTICULO. A continuación se realizarán las siguientes acciones:
- Insertará el Artículo introducido en la Tabla Articulo
- Actualizará la Tabla Almacen, sumando al stock_total del Almacen del Artículo
introducido el stock correspondiente del nuevo Artículo
- Actualizará la Tabla Familia, sumando 1 al número de artículos de la Familia del
nuevo Artículo introducido

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

Referencia Descripción Stock Precio Almacen Familia

1050 Disco Duro Externo 10 70 Almacén Central Discos

1060 Monitor TFT 8 90 Almacén Sur Monitores

1100 Pen Drive 65 GB 12 40 Almacén Norte Memorias

1150 Impresora Laser 0 150 Almacén Central Impresoras

1180 Disco Duro Interno 2 50 Almacén Norte Discos

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.

El nombre que tendrá el Programa que tendremos que entregar será:


gestion_articulos.py

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(...)

# Cerramos el manejador de la Base de Datos y los posibles Cursores


...

Página 28

También podría gustarte