¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
  1. Libros
  2. Python 3
  3. Bases de datos
Extrait - Python 3 Los fundamentos del lenguaje (4ª edición)
Extractos del libro
Python 3 Los fundamentos del lenguaje (4ª edición)
1 opinión
Volver a la página de compra del libro

Bases de datos

Introducción

Una base de datos es, simplemente, un espacio de almacenamiento de datos. El dato, en el corazón de cualquier sistema informático moderno, hace que las bases de datos estén sometidas a requisitos imperativos de fiabilidad (integridad de los datos, coherencia de los datos, tiempo de respuesta...).

Una base de datos relacional es un espacio de almacenamiento que contiene datos organizados en tablas y sus relaciones.

Estos datos pueden manipularse mediante operaciones de álgebra relacional.

Conviene distinguir entre la organización de la base de datos (esquema con las tablas, sus columnas y claves primarias, secundarias, y sus relaciones realizadas mediante claves foráneas (relación uno a uno, uno a varios o varios a varios)) y el contenido de estas tablas, que representa los datos en sí mismos.

Las bases de datos relacionales son las más usadas y, entre ellas, las soluciones libres son las referencias. Existen otros tipos de bases de datos que también se utilizan, tales como las bases de datos de objetos, las bases de datos XML y las bases de datos orientadas a documentos.

Acceso a una base de datos relacional

1. Punto de entrada

Python define una API que permite homogeneizar el uso de las distintas bases de datos. La wiki de Python define EL punto de entrada, que debe conocerse para trabajar con una base de datos relacional (http://wiki.python.org/moin/DatabaseProgramming/).

Este punto de entrada permite acceder a la PEP 249, que describe con claridad la DB-API, y ofrece todas las claves para conocer la manera de utilizar la gran cantidad de recursos que existen a este respecto, incluidas las reflexiones para un futuro.

Esta página se centra bastante en PostgreSQL, dado que esta base de datos es, a día de hoy, la más robusta, la más óptima y la más completa en términos de funcionalidad, y es una referencia. No obstante, la API se aplica también a otras bases de datos, de las que se presenta una lista como primer vínculo de la página (http://wiki.python.org/moin/DatabaseInterfaces).

Las bases de datos relacionales asociadas son IBM DB2, Firebird (and Interbase), Informix, Ingres, MySQL, Oracle, PostgreSQL, SAP DB (también llamada «MaxDB»), Microsoft SQL Server y Sybase, y cada una de ellas dispone de distintos módulos de interfaz, cada uno con sus propias características.

2. MySQL

MySQL es una base de datos relativamente ligera que, en sus orígenes, se concibió para hacer muy pocas cosas (sin claves foráneas, sin relaciones...), para poder llevarlas a cabo rápidamente. Poco a poco, se la ha visto dotada de componentes esenciales del álgebra relacional. En la actualidad, es una verdadera base de datos relacional (con claves foráneas) que ofrece rendimientos relativamente buenos.

Para trabajar con MySQL es preciso, en primer lugar, crear una base de datos y, para ello, utilizar bien el cliente de la consola mysql o bien cualquier otro medio habitual (existe, por ejemplo, MySQL Workbench, que es una excelente herramienta, con una interfaz gráfica y que reúne todas las herramientas necesarias para gestionar la configuración del servidor, la creación de las bases de datos y la ejecución de consultas). He aquí cómo conectarse con el usuario «root» y una contraseña; basta con escribir:

$ mysql -uroot -p 

y, a continuación, escribir la contraseña de manera segura.

Cabe destacar que, para utilizar el cliente...

Uso de un ORM

1. ¿Qué es un ORM?

ORM es el acrónimo de Object Relational Mapping, en español «mapeo objeto-relacional». Un ORM tiene como objetivo la manipulación de los datos de una base de datos relacional a través de la manipulación de objetos sencillos.

Los más vanguardistas ven un primer paso con la generalización de las bases de datos de objeto que remplazarán, según ellos, las bases de datos relacionales clásicas. A decir verdad, esto no parece estar ocurriendo y las bases de datos relacionales tienen todavía un futuro prometedor frente a ellas.

Para simplificar, en lugar de manipular tablas de datos, se manipulan objetos y, en consecuencia, se aprovecha la sintaxis orientada a objetos de la semántica vinculada a los objetos.

La eficacia de un ORM está, por tanto, íntimamente ligada al modelo de objetos del lenguaje de programación. El de Python, al ser excepcional, hace que los ORM de Python proporcionen funcionalidades muy avanzadas y bastante eficaces.

Detrás de este enfoque orientado a objetos, el ORM tiene también como objetivo aislar al usuario de las diferencias existentes entre las distintas bases de datos.

2. ORM propuestos por Python

Las bases de datos relacionales existentes en el núcleo de una gran cantidad de aplicaciones y las posibilidades tan versátiles del modelo de objetos de Python permiten implementar diferentes visiones; de ahí que la competencia sea importante (http://wiki.python.org/moin/HigherLevelDatabaseProgramming).

Si bien ciertas soluciones se desmarcan únicamente por su rendimiento o por su alcance funcional, existen otras que son muy originales. La mayoría de las soluciones provienen de proyectos más amplios y están organizadas para utilizarse de manera independiente.

De este modo, la solución más extendida es SQLAlchemy, que se utiliza por defecto en numerosos frameworks web descentralizados, mientras que Django es una solución monolítica que posee su propia solución con DjangoORM.

SQLObject es una solución también bastante extendida, así como Storm, que aprovecha el soporte de un fabricante importante (Canonical).

Las principales diferencias entre los distintos ORM residen en la sintaxis que proporcionan para manipular los objetos y la cantidad de trabajo que debe realizarse...

Otras bases de datos

1. CSV

CSV es la abreviatura de Comma Separated Values, valores separados por comas, en español. Como su nombre indica, originalmente es un archivo de texto que contiene datos separados por comas. Sin embargo, dado que la coma se puede usar dentro de un valor, y podrían surgir más problemas en función de los datos y de los patrones de representación intrínsecos de los distintos lenguajes, han aparecido otros formatos llamados dialectos. Estos son los principios generales aplicables a todos los dialectos:

  • Los datos se presentan en forma tabular.

  • Cada línea del archivo CSV corresponde a una fila de la tabla.

  • Cada columna del archivo CSV está delimitada a derecha e izquierda por el separador o (exclusiva) por un final de línea.

  • La primera fila del archivo se puede usar para contener los encabezados de las columnas, pero no es obligatorio.

  • En función del formalismo, se puede admitir que todas las filas no tengan la misma cantidad de columnas o considerarse esto como un error.

PEn el material disponible para descargar correspondiente a este libro encontrará archivos con información sobre municipios, provincias y comunidades autónomas españolas.

Python dispone de las herramientas necesarias para acceder a bajo nivel a los datos de un archivo CSV, pero también para representar estos datos con ayuda de simples listas y diccionarios que son objetos habituales de Python manipulables con mucha facilidad. El módulo se llama csv, forma parte de las bibliotecas integradas de Python y está incorporado en Python 3.

>>> import csv 

Esta es la primera dificultad. En CSV solo se trabaja en unicode, el formato de cadenas de caracteres predeterminado de la rama 3 de Python. Pues bien, los archivos que vamos a usar no son archivos Unicode.

Entonces, la lectura no se realiza correctamente:

>>> with open('com_auto2011.txt', 'r') as f:  
...     datas = csv.reader(f)  
...     next(datas)  
...   
Traceback (most recent call last):  
  File "<stdin>", line 3, in <module> 
  File "/usr/lib/python3.2/codecs.py", line 300, in decode 
    (result, consumed) = self._buffer_decode(data, self.errors, final) 
UnicodeDecodeError: 'utf8'...

LDAP

1. Protocolo

LDAP son las siglas de Lightweight Directory Access Protocol y es, como su propio nombre indica, un protocolo destinado a acceder a los datos presentes en un directorio, con forma de arborescencia estandarizada.

Este protocolo incluye un modelo de datos, un modelo de nomenclatura, un modelo funcional, un modelo de seguridad y un modelo de replicación.

2. Servidores

Existen multitud de servidores que permiten crear directorios LDAP, llamados servidores LDAP, o implementaciones del protocolo LDAP. Los dos principales son openLDAP y Apache Directory Server.

El primero es una implementación libre que almacena los datos en una base BerkeleyDB, pero que puede almacenarlos de otras formas. Es una referencia absoluta, muy extendida, con un buen rendimiento, fiable y dispone de una comunidad impresionante en términos de competencia y capacidad de reacción, entre otras cualidades.

Apache Directory Server es una versión desarrollada en Java, destinada a contentar a los puristas de lenguaje, permitiéndoles integrar, e incluso embarcar, un servidor LDAP escrito en Java. Está bastante extendido entre las principales aplicaciones Java, aunque Python, como cualquier otra tecnología, también puede acceder.

3. Terminología

Los datos se presentan bajo la forma de una estructura arborescente. Esta dispone de una raíz (root) cuyo nombre se corresponde, por convención, con la rama DNS que representa la situación del directorio. Todos los datos se asocian a esta raíz.

Los datos que son terminales (no tienen datos asociados) se denominan hojas, y los demás elementos son nodos, por contraposición.

En función de la pertenencia de un dato (nodo u hoja) a un nodo padre, su característica propia (RDN, por relative distinguished name), que es única respecto a los demás miembros contenidos en el nodo padre, puede ser una organización (o), una unidad organizativa (ou), un nombre (cn) u otro.

Un objeto cualquiera posee una o varias clases y varios atributos, algunos de ellos obligatorios por su pertenencia a las clases (por ejemplo, el atributo RDB viene impuesto por la clase y es obligatorio para una persona (InetOrgPerson, sn es obligatorio, como lo es cn, que es el RDN)). Cada atributo es multivaluado, es decir, está diseñado para recibir varios valores.

Existe un identificador único llamado dn (por...