Acceso a bases de datos
Introducción
Después de dar a conocer la arquitectura Zope, mostrar un ejemplo
de creación de un sitio con Zope, Rayo de Luz, y presentar los
objetos básicos en Zope, ha llegado el momento de atacar otro
de los temas más importantes del desarrollo de aplicaciones en
Internet: las bases de datos.
Adaptador de acceso a base de datos
La idea detrás de los adaptadores de acceso a base de datos de Zope
es la tradicional dentro del mundo de las bases de datos: crear
una capa de abstracción con la interfaz propia de la base de datos.
De esta forma se logra una interfaz unificada para acceder a
cualquier base de datos que tenga adaptador para Zope. Esto
es algo totalmente similar a nivel conceptual a ODBC, JDBC
o Perl DBI.
En la actualidad existen para Zope adaptadores para acceder a:
- MySQL
- Postgres
- Oracle
- Sybase
- Interbase
- ODBC
- Gadfly
Al tener un adaptador para ODBC podemos acceder a casi cualquier base
de datos, ya que ya es raro a día de hoy que una base de datos no
sea accesible al menos desde ODBC.
En el caso del software libre los adaptadores que más nos interesan
son el de MySQL y el de Postgres. En el caso de Postgres se dispone
de varios adaptadores, siendo la base de datos mejor soportada desde
Zope, a parte de la propia ZODB, que recordemos es la base de datos que usa
Zope para guardar todos los objetos. En este artículo nos vamos a
centrar en MySQL, pero todo lo que digamos es idéntico para cualquiera
de los otros adaptadores a excepción de la instalación del
producto que contiene el adaptador para cada base de datos concreta.
A lo largo del artículo vamos a ir cubriendo el proceso de instalación
de un adaptador de acceso a base de datos desde Zope, su uso desde
Zope y algunas herramientas que se basan en estos adaptadores y que
permiten de forma sencilla crear formularios para almacenar datos
en las base de datos.
Instalación del adaptador de MySQL
Los adaptadores de Zope para acceso a base de datos no son
otra cosa que productos Zope. Por ello para su instalación localizamos
el producto desde las páginas del portal de Zope y lo instalamos.
En el caso de la distribución Debian 2.2/Potato es muy sencilla la
instalación de los adaptadores de MySQL y Postgres ya que dispones
de paquetes para ello.
faro:/shared/acs# apt-get install zope-mysqlda
Reading Package Lists... Done
Building Dependency Tree... Done
The following extra packages will be installed:
python-mysqldb
The following NEW packages will be installed:
python-mysqldb zope-mysqlda
0 packages upgraded, 2 newly installed, 0 to remove and 59 not upgraded.
Need to get 0B/42.8kB of archives. After unpacking 174kB will be used.
Do you want to continue? [Y/n]
Media Change: Please insert the disc labeled 'Debian GNU/Linux 2.2 r0
_Potato_ - Official i386 Binary-3 (20000814)' in the drive '/cdrom/' and
press enter
Selecting previously deselected package python-mysqldb.
(Reading database ... 50092 files and directories currently installed.)
Unpacking python-mysqldb (from .../python-mysqldb_0.1.1-1.deb) ...
Selecting previously deselected package zope-mysqlda.
Unpacking zope-mysqlda (from .../web/zope-mysqlda_1.1.3-1.deb) ...
Setting up python-mysqldb (0.1.1-1) ...
Setting up zope-mysqlda (1.1.3-1) ...
For Zope to recognize the new/updated package, it will need to be
restarted.
Restart Zope now? [Y] Y
Podemos ver que también se instala el paquete python-mysqldb. No olvidemos
que casi todo en Zope está hecho en Python, aunque Perl poco a poco
irá ocupando un papel importante, y python-mysqldb es una librería
de Python para acceder a MySQL. No vamos a cubrir en el artículo la
instalación manual del adaptador pero el lector puede encontrar
información al respeto dentro de la página del adaptador de MySQL
que se encuentra en las referencias.

Si todo ha ido bien deberíamos de tener un nuevo objeto disponible en
Zope, el de conexión a un servidor de bases de datos MySQL. Si lo
seleccionamos por primera vez nos pedirá los datos necesario para
poder conectar con la base de datos. Vamos a partir de que ya tenemos
instalado el servidor de MySQL en el sistema y vamos a crear la
base de datos para RayodeLuz y a dar permisos al usuario "rayodeluz"
para que pueda sacar datos de ella y modificarlos, aunque no borrarlos.
MySQL dispone de la función de SQL GRANT que es muy útil en este tipo
de situaciones ya que permite controlar con mucha precisión y
sencillez que puede hacer cada usuario en la base de datos. Pero
como no estamos en un artículo de MySQL, no profundicemos más en
el tema. Los comandos a enviar a MySQL desde su cliente "mysql" son:
mysql> create database RayodeLuz;
mysql> GRANT SELECT, UPDATE, INSERT ON RayodeLuz.* TO rayodeluz@localhost;
Ahora ya desde la pantalla de configuración de conexiones MySQL
configuramos estos datos para poder acceder al servidor de MySQL
y vemos que se establece una conexión con MySQL. Este objeto que
se acaba de crear es ya una conexión permanente con MySQL que nos
sirve para, a través de él, poder enviar comandos SQL a la base
de datos, entre otras cosas que ya iremos viendo.
Creación de una base de datos de Clientes
Ahora que buscábamos un buen ejemplo para mostrar el funcionamiento de
las bases de datos en Zope, recibimos una llamada del responsable
del departamento comercial: necesitan un sistema de seguimiento de
contactos con los clientes y los potenciales clientes de la empresa.
Bien, esto es sencillo. Nos creamos una tabla donde almacenamos
esta información, la cual se llenará con los datos que vayan
introduciendo los comerciales de la empresa y en la que tendremos que
poder hacer búsquedas por distintos criterios.
Manos a la obra: lo primero es crear una tabla para almacenar la
información de los contactos comerciales.
CREATE TABLE contactos (
id int(11) DEFAULT '0' NOT NULL auto_increment,
nombre varchar(64),
contacto varchar(64),
telefono varchar(32),
email varchar(32),
url varchar(32),
comentario text,
autor varchar(32),
sello timestamp,
PRIMARY KEY (id)
);
Para poder ejecutar este comando podemos utilizar ya la conexión
con la base de datos que hemos creado. Vemos que entre todos los
objetos que tenemos creados como parte del sitio de Rayo de Luz,
uno de ellos es la conexión a base de datos MySQL.
Si seleccionamos el objeto "MySQL_database_connection" tenemos una
serie de posibilidades como son ver la descripción del objeto para
ver a que base de datos está conectando y como que usuario,
podemos desconectar al objeto de la base de datos y volverlo a conectar
y una de las solapas accesibles para este objeto se llama "Test".
Tras ella tenemos una simple interfaz que nos permite hacer peticiones
a la base de datos.
Si intentamos enviar la sentencia SQL de creación de la tabla
recibimos un mensaje de error ya que en la sentencia de "GRANT"
(permitir) del usuario "rayodeluz" no incluimos la posibilidad de
crear tablas. Basta con hacer un nuevo GRANT de la siguiente forma:
mysql> GRANT CREATE ON RayodeLuz.* TO rayodeluz@localhost;
mysql> FLUSH PRIVILEGES;
Es bueno tras realizar este tipo de cambios volver a reconectar
con la base de datos para que tenga en cuenta las modificaciones.
Para ello basta con ir a la ventana principal del objeto de conexión
a la base de datos y pulsar sobre el botón de desconectar. Luego
se pulsa de nuevo el botón de conectar y ya tendremos de nuevo
abierta la conexión con la base de datos. Si volvemos a la
solapa "test" desde la que podemos hacer peticiones y enviamos el
comando SQL de creación de la tabla, esta será creada. Algo que
podemos verificar con el comando SQL "show tables".
Vemos pues que tenemos ya una conexión con la base de datos y que
podemos enviar peticiones SQL a través de este objeto. Es más,
los resultados de las peticiones SQL se nos presentan en tablas
HTML que incluso podrían servir para mostrar los resultados de
las búsquedas pero, ¿cómo creamos ahora los formulario que nos
permitan introducir datos en la base de datos? ¿Y aquellos que
nos permiten realizar búsquedas?
La primera gran utilidad que tenemos son los objetos ZSQL Methods que
se asocian a una conexión a una base de datos y permiten construir
peticiones SQL. Las dos funcionalidades que queremos cubrir son
la inserción de datos y su posterior consulta y como vemos a
continuación, ambas funciona lides quedan cubiertas con métodos SQL.
Para crear un formulario de inserción de datos en la tabla creamos
un nuevo objeto ZSQL en el que como parámetros aparezcan los campos
que queremos poder introducir en la base de datos y la petición
sea de tipo INSERT. Veamos una captura de pantalla de ese nuevo
objeto ZSQL y su definición:
Vemos que el procedimiento es realmente sencillo y válido de forma
general para cualquier tipo de formulario. De cara a la
inserción de datos este
objeto se visualizará de la siguiente forma:
Ahora que ya sabemos como introducir datos vamos a ver como recuperarlos
de la base de datos. De nuevo utilizamos para ello un ZSQL Method y
su configuración la podemos observar a continuación:

Pero para las búsquedas disponemos de otro sistema un poco más
sencillo de crear y más potente, los objetos Z Search Interface.
Con ellos, la construcción de complejas peticiones de búsqueda dentro
de la base de datos se hace de una forma mucho más cómoda y que
además, podremos personalizar de forma sencilla. Un objeto
Z Search Interface utiliza un ZSQL Method para definir sobre que
campos se quiere poder buscar y genera de forma automática el
formulario de búsqueda y la página de presentación de resultados.
Este objeto ya lo utilizamos cuando hablamos de las posibilidades
de catalogación de contenidos en Zope, utilizando ZCatalog, y
para construir el formulario de búsqueda y la página de presentación
de resultados sólo necesita un objeto que sea "buscable". Y
los ZSQL Method lo son, por lo que podemos seleccionar por ejemplo
nuestro método de localización de contactos para construir sobre
él la interfaz de búsqueda. Como ya hablamos en su momento
a partir de Z Search Interface se crean dos nuevos objetos Zope
mediante los cuales el usuario puede introducir los
datos de la búsqueda y puede ver los resultados.

Prácticamente ya hemos visto como se usan las bases de datos relacionales
desde Zope. La gran parte que quedaría por analizar es ver como desde
DTML y desde clases Python se pueden utilizar estos objetos de acceso
a base de datos para poder utilizar de una forma más directa la
información que se guarda en las bases de datos relacionales. Pero
como durante el curso no hemos cubierto aspectos de programación
de más bajo nivel y hemos preferido seguir una línea más orientada
a la construcción de sitios a partir de objetos ya realizados, no
vamos a entrar en estas posibilidades.
Las bases de datos relacionales han sido durante los últimos años el
lugar preferido en la industria del desarrollo software para guardar
los datos de las aplicaciones. El lograr poder acceder desde Zope a
este tipo de fuentes de datos de forma sencilla nos permite estar
tranquilos cuando pensemos en la integración de Zope con sistemas
ya existentes. Y al disponer Zope de acceso tanto a bases de datos relacionales
como a su base de datos orientada a objetos, ZODB, le convierte en
una arquitectura muy flexible que puede dar cabida a complejas
arquitecturas.
La llegada de Internet a impulsado aún más la importancia de las bases
de datos. La posibilidad de construir bases de datos de forma distribuida
a través de la red y al necesidad cada vez mayor de gestionar ingentes
cantidades de datos hacen que MySQL y Postgres ocupen a día de hoy un
papel estrella dentro del desarrollo de aplicaciones en Internet. Zope
puede acceder sin problemas a estas bases de datos por lo que entornos
combinados donde aplicaciones Perl o PHP trabajen con partes Zope son
perfectamente factibles ya que se pueden compartir la información
en las bases de datos. Según madura el desarrollo de aplicaciones para
Internet, este tipo de entornos mixtos cobrarán cada vez más importancia
ya que en muchos proyectos se ahorrará mucho tiempo gracias a la
reutilización de diferentes partes ya desarrolladas. Un ejemplo podría
ser un portal para desarrolladores utilizando el Portal Tookit de Zope
pero que para la parte de gestión de los proyectos, utilice Source Forge,
basado totalmente en PHP, pero que guarda sus datos en MySQL y, para
la parte de foros, se utilizaría slashcode, el software en el que se
basa Slashdot y BarraPunto, y que está desarrollado en Perl, pero que
de nuevo, guarda toda la información en una base de datos MySQL.
Conclusiones del curso de Zope
Con esta 5 entrega damos por finalizado este primer curso introductorio
a Zope, que se ha publicado originalmente en Todo Linux, pero que
se podrá obtener en formato electrónico desde mi página personal
dentro de la sección de Internet con
licencia GFDL pasado un mes desde la publicación de esta última
entrega.
El curso ha tenido una buena aceptación y gran parte de los lectores han
perdido el miedo a lanzarse con Zope tras ver lo sencillo que resulta su
uso.
En la primera entrega del curso analizamos la arquitectura de Zope, sencilla
una vez que se conocen sus piezas, pero que hay que entender de forma
correcta para saber como hacer las cosas en Zope. Las partes más
destacadas de esta arquitectura eran la base de datos de objetos
y el ORB de Zope, que se encarga de transformar las URL que llegan
a Zope en peticiones sobre los objetos Zope. No hay que olvidar en
ningún momento el concepto clave de Zope: todo son objetos. Si el lector
conoce Java, le será familiar las implicaciones que conlleva esta
afirmación. Esta homogeneidad, unida a que la persistencia de los objetos
se logra utilizando una base de datos de objetos (ZODB), permite
funcionalidades bastante sorprendentes como búsquedas de cualquier tipo
de información en la base de datos, control de versiones, posibilidad
de deshacer todo tipo de cambios ... En este misma entrega hablamos de
la licencia de Zope, la ZPL, que si bien no es compatible con la GPL,
la FSF la califica de software libre.
En la segunda entrega del curso ya nos pusimos un poco más prácticos
y nos lanzamos tras la creación del portal de la empresa Rayo de Luz,
una empresa ficticia pero que nos ha servidor para ir viendo como
Zope resuelve todo tipo de necesidades de una forma elegante, potente
y flexible. Vimos lo sencillo que era crear un sitio con Zope, como
se van añadiendo objetos para construir el web, lo sencillo y
potente que es el control de acceso de Zope, basado en roles y
las distintas funciones que se pueden realizar en el sistema. Y quizá
vimos lo más importante de Zope: los mecanismos de adquisición mediante
los que se heredan todo tipo de propiedades a través de la estructura
jerárquica que forma la organización en objetos directorio de un
sitio Zope.
Para la tercera entrega ya estábamos más entrenador y nos pudimos meter
a fondo con los productos Zope, las piezas a partir de las cuales
construimos los sitios Zope. Vimos de donde obtener dichos productos,
como se instalan y como se utilizan, dando un repaso al uso de todos
los objetos que vienen incluidos en Zope por defecto. Por último
vimos el espectacular mecanismo de catalogación de Zope que permite
de forma rápida y cómoda construir índices de todos los objetos que
hay en la base de datos de Zope (ZODB) para luego realizar búsquedas
sobre ellos.
Dentro de la cuarta entrega nos centramos en un producto Zope que da
mucho juego, Squishdot, un sistema para la creación de weblogs
al estilo Slashdot o BarraPunto. Después de ver como obtener todo tipo de
productos Zope, como están organizados dentro del portal Zope y
de llegar a Squishdot, vimos como instalarlo y como ir poco
a poco configurándolo. Pudimos ver como en poco más de 10 minutos se
podía instalar un potente sistema de foros, aunque luego fuera
necesario un periodo posterior de configuración del aspecto y del
contenido.
Por último en esta quinta entrega hemos mostrado lo ágil que es Zope
en su trato con las bases de datos relacionales, donde utiliza la
metodología de crear una API común para todas las bases de datos y
que luego se vayan desarrollando adaptadores que lleven esa API a la
interfaz concreta de cada base de datos. Nos hemos centrado en un ejemplo
con MySQL, donde hemos visto cual es el adaptador a utilizar,
como configurarlo y lo sencillo que es crear formularios de inserción
de datos y búsqueda así como de la presentación de los resultados de
las búsquedas.
Desde aquí recordar al lector que todo el curso podrá obtenerse de
Internet desde la URL http://sinetgy.org/acs en la sección de Internet
y que tiene la puerta abierta para ayudar en la mejora de este curso
y su ampliación con el objetivo de que Zope vaya disponiendo de una
documentación en castellano que permita que cada vez más gente pueda
descubrir este sistema de publicación web y pueda basara en el sus
proyectos.
Por último agredecer a Todo Linux su política en la que los autores
preservan los derechos de autor sobre los artículos permitiendo de esta
forma que dichos trabajos puedan tener una audiencia mucho mayor a
través de su publicación en la red, así como la posibilidad de ser
corregidos y ampliados.
Referencias