Вы находитесь на странице: 1из 40

Introduccin a PostgreSQL

Un ejemplo sencillo

Toms Javier Robles Prado Ral Turienzo Fernndez

Introduccin a PostgreSQL: Un ejemplo sencillo por Toms Javier Robles Prado y Ral Turienzo Fernndez

Se autoriza la copia, distribucin y/o modicacin de este documento segn los trminos de la GNU Free Documentation License (Licencia de documentacin libre GNU), versin 1.1 o cualquier versin posterior publicada por la Free Software Foundation; sin secciones invariables, textos previos o textos nales. Los programas de ejemplo de este documento son software libre; pueden ser redistribuidos y/o modicados segn los trminos de la licencia de Python publicada por la Python Software Foundation.

Historial de revisiones Revisin 0.01 25-11-2002 Revisado por: tjrp-rtf Documento de partida Revisin 0.10 16-12-2002 Revisado por: tjrp-rtf Documento terminado

Tabla de contenidos
1. Introduccin.......................................................................................................................1 2. Empezando.........................................................................................................................3 Consiguiendo e instalando PostgreSQL ...................................................................3 Poniendo en marcha el servidor ................................................................................3 Administracin remota con OpenSSH ........................................................................4 3. Describiendo el problema...............................................................................................9 Enunciado del problema .............................................................................................9 Construyendo el diagrama E-R..................................................................................9 Construyendo las tablas ............................................................................................13 Consultando nuestra Base de Datos........................................................................16 Consideraciones nales .............................................................................................17 Observaciones ...................................................................................................17 Semntica no reejada .....................................................................................18 4. Pgaccess: La herramienta grca de PostgreSQL ....................................................19 Introduccin a Pgaccess ...........................................................................................19 Utilizando Pgaccess..................................................................................................20 5. Accediendo mediante software: Pycemen ...................................................................25 Por qu Python?........................................................................................................25 Comentando el programa .........................................................................................25 Funcionalidades de Pycemen ..........................................................................25 Pycemen en accin.............................................................................................26 Por qu una interfaz basada en texto? .........................................................28 6. Conclusiones nales.......................................................................................................31 7. Por dnde sigo? .............................................................................................................33 Bibliografa ..................................................................................................................33 ndice.....................................................................................................................................35

iii

iv

Captulo 1. Introduccin
En los ltimos aos, el software de bases de datos ha experimentado un auge extraordinario, a raz de la progresiva informatizacin de casi la totalidad de las empresas de hoy da. No es extrao pues, que existan multitud de gestores de bases de datos, programas que permiten manejar la informacin de modo sencillo. De este modo tenemos Oracle1, Microsoft SQL Server2, Borland Interbase3 entre otras. Las soluciones software que hemos citado son comerciales. Como siempre, en el mundo del software libre, siempre que se necesita algo, tarde o temprano se implementa. As tenemos MySQL4, gestor muy usado en la web (combinado con php y apache) o PostgreSQL5, que ser el gestor que trataremos 6 . Como hemos comentado, PostgreSQL es software libre. Concretamente est liberado bajo la licencia BSD, lo que signica que cualquiera puede disponer de su cdigo fuente, modicarlo a voluntad y redistribuirlo libremente 8, PostgreSQL adems de ser libre es gratuito y se puede descargar libremente de su pgina web para multitud de plataformas. La versin actual de PostgreSQL es la 7.3, liberada el 27 de Noviembre de 2002 y puede descargarse libremente desde su sitio ocial9. Incluso, si se tiene curiosidad, se puede bajar un chero de audio con la pronunciacin correcta10 de PostgreSQL.

Notas
1. http://www.oracle.com 2. http://www.microsoft.com/sql/default.asp 3. http://www.borland.com/interbase/index.html 4. http://www.mysql.com 5. http://www.postgresql.org 6. Existe una interesante 7. http://www.mmlabx.ua.es/mysql-postgres.html . Viene a decir que PostgreSQL es superior en BBDD "a lo grande", mientras que para conjuntos de datos pequeos o medianos MySQL gunciona mejor. 7. http://www.mmlabx.ua.es/mysql-postgres.html 8. Es ms, la licencia BSD permite redistribuir el cdigo modicado o no como software cerrado, en contraposicin a la licencia GPL que fuerza a que las modicaciones sean publicadas tambin bajo la GPL. 9. http://www.postgresql.org 10. http://www.fr.postgresql.org/postgresql.mp3

Captulo 1. Introduccin

Captulo 2. Empezando
Consiguiendo e instalando PostgreSQL
Vamos a describir el proceso de instalacin de PostgreSQL para Linux. En nuestro caso hemos utilizado la distribucin RedHat 8.0. RedHat utiliza un sistema de gestin de paquetes denominado RPM que permite instalar fcilmente el gestor de base de datos. Adems PostgreSQL viene incluido en la distribucin estndar por lo que simplemente hemos de instalar los paquetes q nos interesen:
[jav@cable213a078 jav]$ rpm

-Uvh postgresql-7.2.2-1.i386.rpm

En caso de no usar distribuciones basadas en RPM o simplemente por gusto, podemos bajar el cdigo fuente de PostgreSQL de su web1. Una vez bajado, lo descomprimimos,
[jav@cable213a078 jav]$ tar xvzf

postgresql-7.2.2-1.tar.gz

nos movemos al directorio resultante y ejecutamos el script de conguracin. 2


[jav@cable213a078 postgresql]$

./configure

Si todo ha ido bien, es hora de compilar. Para ellos ejecutaramos


[jav@cable213a078 postgresql]$ make

y si no hay errores, nos logueamos como root y ejecutamos


[root@cable213a078 postgresql]# make install

Y ya tenemos PostgreSQL instalado en nuestro equipo.

Poniendo en marcha el servidor


Veamos ahora cmo hacer funcionar el servidor de base de datos. Lo primero es jar la variable de entorno que almacenar la ruta hasta el directorio donde guardaremos la informacin de la base de datos:
[jav@cable213a078 postgresql]$ export PGDATA=/el/path/deseado/data

En nuestro caso:
[jav@cable213a078 postgresql]$ export PGDATA=/home/jav/db/data

El siguiente paso es crear las estructuras necesarias para iniciar el servidor de la base de datos. Esto se consigue con la orden initdb:
[jav@cable213a078 postgresql]$ initdb The files belonging to this database system will be owned by user "jav". This user must also own the server process. Fixing permissions on existing directory /home/jav/db/data... ok creating directory /home/jav/db/data/base... ok creating directory /home/jav/db/data/global... ok creating directory /home/jav/db/data/pg_xlog... ok creating directory /home/jav/db/data/pg_clog... ok creating template1 database in /home/jav/db/data/base/1... ok creating configuration files... ok

Captulo 2. Empezando
initializing pg_shadow... ok enabling unlimited row size for system tables... ok creating system views... ok loading pg_description... ok vacuuming database template1... ok copying template1 to template0... ok Success. You can now start the database server using: /usr/bin/postmaster -D /home/jav/db/data or /usr/bin/pg_ctl -D /home/jav/db/data -l logfile start

Siguiendo las instrucciones que amablemente nos da initdb iniciamos el servidor, aadiendo los parmetros -i (para admitir conexiones TCP/IP, ya lo explicaremos ms adelante) y -o para obtener formato de fechas europeo en nuestra base de datos:
[jav@cable213a078 db]$ /usr/bin/postmaster -o -i -D /home/jav/db/data &

Tras algunos mensajes de depuracin, tenemos el servidor corriendo en nuestra mquina. Ahora crearemos una base de datos para ver que la cosa marcha:
[jav@cable213a078 db]$createdb pepa CREATE DATABASE

Como nos hemos quedado un poco fros con la respuesta de PostgreSQL vamos a ver si podemos hacer algo con esta base de datos:
[jav@cable213a078 db]$ psql pepa Welcome to psql, the PostgreSQL interactive terminal. Type: \copyright for distribution terms \h for help with SQL commands \? for help on internal slash commands \g or terminate with semicolon to execute query \q to quit

pepa=# create table provincias(prefijo integer, nombre varchar(20)); CREATE pepa=# insert into provincias values(987, Len); INSERT 16559 1 pepa=# insert into provincias values(91, Madrid); INSERT 16560 1 pepa=# insert into provincias values(923, Salamanca); INSERT 16561 1 pepa=# select * from provincias; prefijo | nombre ---------+----------987 | Len 91 | Madrid 923 | Salamanca (3 rows)

Pues bueno, parece que la cosa funciona. Ya tenemos todo en marcha y funcionando. En adelante pasaremos a cosas mayores.

Captulo 2. Empezando

Administracin remota con OpenSSH


En este apartado veremos cmo acceder a un mquina remota (donde est corriendo la base de datos) de modo seguro para administrarla. Para ello utilizaremos ssh que permite establecer conexiones entre mquinas de modo que toda la informacin que intercambien vaya encriptada. Lo primero es habilitar el servidor ssh en la mquina a la que pretendamos acceder.ssh utiliza el puerto 22 para las comunicaciones. Una vez cumplido este paso, ya estamos listos para aceptar conexiones remotas. Ya hemos congurado lo necesario del lado del servidor. Veamos ahora los pasos necesarios del lado del cliente. Distinguiremos entre mquinas Linux y Windows 3 .

En Linux (o Unix) posiblemente ya tengamos el cliente ssh instalado. Si no es as nos dirigiremos al sitio ocial de OpenSSH4 de donde bajaremos los fuentes, los compilaremos e instalaremos. Dependiendo de la distribucin que usemos ser ms fcil o ms difcil encontrar paquetes precompilados que nos ahorren el trabajo. Suponiendo que ya tenemos el cliente instalado, es hora de acceder a la mquina remota. Sin entrar en detalles, diremos que basta con:
[jav@cable213a078 jav]$ ssh bbdd@212.183.213.178 bbdd@212.183.213.178s password: Esta cuenta aloja el trabajo de BBDD Directorios: -datos: Contiene los ficheros de la base de datos -docbd: Contiene los fuentes de la documentacin y la documentacin en s. Ejecute make single-html para documentacin en un nico html o make multiple-html para documentacin en varios html. -programa: Contiene el cdigo del programa que acceda a la BBDD Cualquier duda puede remitirla a tjavier@usuarios.retecal.es o rtf@usuarios.retecal.es
[bbdd@cable213a078 bbdd]$

Genricamente basta con ssh login@IP y se nos pedira el password. Una vez introducido, ya estaremos trabajando en la mquina remota y todo lo que hagamos se ejecutar en ella:
[bbdd@cable213a078 bbdd]$ ls datos docbd programa

En Windows actuaremos de un modo similar. Lo primero ser bajar PuTTY5, un cliente para conexiones ssh en windows. PuTTY tiene una interfaz amigable, en la que slo tendremos que especicar la IP a la que conectarnos en indicar que pretendemos hacer una conexin ssh:

El aspecto de PuTTY funcionando es similar al de una consola de Unix. Tras un rato trabajando con PuTTY se nos olvidar que estamos utilizando Windows.

Captulo 2. Empezando

En ocasiones ser necesario mover archivos de nuestra mquina local a la remota o viceversa. En Windows existe una aplicacin que proporciona una interfaz de usuario a scp (secure copy). Esta aplicacin de llama WinSCP6 y es tambin muy sencilla de usar, con una conguracin muy intuitiva:

Hemos descrito herramientas que nos servirn para conectarnos a la mquina que aloje la base de datos. Esto ser til para administrarla sin estar fsicamente junto a ella y ayuda a que diferentes personas trabajen sin molestarse (n manos teclean ms que 2). 6

Captulo 2. Empezando

Notas
1. http://www.postgresql.org 2. Si algo va mal, o tiene necesidades especiales (un directorio diferente del estndar, compilacin para otras arquitecturas...) debera ejecutar
[jav@cable213a078 postgresql]$ ./configure --help

y observar la salida.

3. Las IPs que aparecen en los ejemplos son inventadas (obviamente). 4. http://www.openssh.com/ 5. http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html 6. http://winscp.vse.cz/eng/download.php

Captulo 2. Empezando

Captulo 3. Describiendo el problema


Enunciado del problema
Se desea implementar una base de datos para facilitar la gestin y administracin de un cementerio, en dicha base de datos se contemplan diferentes categoras laborales, distintos tipos de enterramiento, facturas por los servicios prestados, incluso se permite que una familia posea su propio panten para un determinado nmero de personas. El cementerio est dividido en sectores, teniendo estos una capacidad y extensin variable que ha de quedar reejada. Asimismo se ha quiere tener informacin sobre los empleados mediante datos personales como nombre y apellidos,direccin, telefno, salario, antigedad, etc. Las categoras en las que se dividen los empleados son:

Enterradores Jardineros Administrativos

Los jardineros se ocuparn del cuidado de los sectores, de tal forma que un jardinero est al cuidado de un sector, aunque del cuidado de un sector pueden encargarse varios jardineros. Asimismo,cada sector contendr un determinado nmero de tumbas.Una tumba pertenece a un sector. Las Tumbas pueden ser de uno de los siguientes tipos:

Nicho Panten Fosa Comn

Es necesario, adems, almacenar informacin sobre el fallecido, as como de la persona (familiar) que se har cargo de los costes del servicio (todo ello, obviamente identicado mediante los datos personales y de inters para la empresa).

Cada fallecido es enterrado por un nico enterrador,lgicamente el enterrador puede enterrar a mas de un fallecido durante su jornada laboral. Los nichos tienen capacidad para una sola persona. Sin embargo un panten tiene capacidad para varias personas siendo lo normal 4, siendo por eso de tipo smallint. La capacidad de una Fosa Comn es superior a la de un panten, y es de tipo integer. En este caso y en los dos anteriores asumimos la indivisibilidad del fallecido.

Adems, los administrativos emiten facturas para los familiares, de tal forma que un administrativo puede emitir facturas a varios familiares, y un familiar puede recibir varias facturas El nico tipo de tumba que puede ser propiedad de un familiar es el panten, siendo propiedad de una nica persona, y dicha persona puede poseer varios panteones.

Captulo 3. Describiendo el problema

Construyendo el diagrama E-R


Para realizar el diagrama de entidad-relacin hemos de decidir los conjuntos tanto de entidades como de relaciones, atendiendo al enunciado del problema, la estructura del diagrama ha quedado como sigue:

Entidades: 1. Empleado (que constar a su vez de tres tipos: Jardinero, Enterrador y Administrativo). 2. Sector (en los que est dividido el cementerio). 3. Tumba (puede ser de tres tipos: Nicho, Panten y Fosa Comn). 4. Fallecido (Representa a la persona muerta mediante los atributos detallados mas tarde). 5. Familiar (Es necesario enviar la factura a los familiares del fallecido).

Relaciones: 1. JarSec ( Indica la relacin de los jardineros con los sectores del cementerio) 2. TumSec (Relacin que se da entre las tumbas y los sectores en que estn ubicadas) 3. EnFa (Es la relacin que se establece entre los enterradores y los fallecidos). 4. Factura (Representa la venta de una tumba a la familia del fallecido). 5. NiFa (Indica si el fallecido tiene asignado un Nicho). 6. FoFa (Indica si el fallecido se encuentra en una Fosa Comn). 7. PanFa (Indica si el fallecido se encuentra en un Panten). 8. FamFa (Es la relacin establecida entre el fallecido y su familia). 9. PaFam (Relacin que indica la posesin de un panten por parte de una familia).

A continuacin hablaremos de los pormenores tanto de las entidades como de las relaciones, especicando atributos, tipos de relaciones, cardinalidades y todo aquello que sea interesante destacar. Comenzamos pues por los atributos propios de cada entidad: La entidad Familiar tiene 5 atributos:

Nombre: Nombre del familiar al que se enva la factura. Apellidos: Contiene los apellidos del familiar. Telefono: Telfono de contacto del familiar. Direccion: Almacena la direccin (calle, numero, piso, etc). ID_Familia: Cdigo identicador de un familiar, es la clave primaria de esta tabla.

La entidad Enterrador tiene 8 atributos:


Nombre: Representar el nombre del empleado. Apellidos: Contienen los apellidos del empleado. Direccin: Almacena la direccin (calle, numero, piso, etc). Telfono: Nmero de telfono de contacto. Telef_Movil: Nmero de telfono mvil.

10

Captulo 3. Describiendo el problema


Antigedad: Aos de servicio en la empresa. Salario: Sueldo en Euros . DNI: Contiene el nmero del DNI, es la clave primaria de esta entidad.

La entidad Administrativo tiene 8 atributos:


Nombre: Representar el nombre del empleado. Apellidos: Contienen los apellidos del empleado. Direccin: Almacena la direccin (calle, numero, piso, etc). Telfono: Nmero de telfono de contacto. Telef_Movil: Nmero de telfono mvil. Antigedad: Aos de servicio en la empresa. Salario: Sueldo en Euros . DNI: Contiene el nmero del DNI, es la clave primaria de esta entidad.

La entidad Sector tiene 4 atributos:


Nombre: Nombre de cada sector o zona del cementerio. ID_Sector: Cdigo identicador de zona Supercie: Extensin en m2 Capacidad: Nmero de fallecidos que puede alojar.

La entidad Jardinero tiene 9 atributos:


Nombre: Representar el nombre del empleado. Apellidos: Contienen los apellidos del empleado. Direccin: Almacena la direccin (calle, numero, piso, etc). Telfono: Nmero de telfono de contacto. Antigedad: Aos de servicio en la empresa. Salario: Sueldo en Euros Sector: El sector del cementerio donde trabaja. Clave ajena tomada de Sector. DNI: Contiene el nmero del DNI, es la clave primaria de esta entidad.

La entidad Tumba tiene 4 atributos:


ID_Tumba: Cdigo identicadore de tumba. Tipo: Puede ser de tres tipos: Nicho, Panten o Fosa Comn. Sector: Sector en que se encuentra la tumba. Clave ajena tomada de Sector.

La entidad Nicho tiene 3 atributos:


Altura: Altura del nicho ID_Nicho: Cdigo identicador de nicho. Clave primaria y Clave Ajena tomada de Tumba (ID_Tumba). Inscripcion: Texto que gura en el.

La entidad FosaComun tiene 3 atributos:

ID_Fosa: Cdigo identicador de Fosa Comn. Clave primaria y Clave Ajena tomada de Tumba (ID_Tumba). 11

Captulo 3. Describiendo el problema

Capacidad: Nmero de fallecidos que puede contener.

La entidad Panteon tiene 4 atributos:


ID_Panteon: Cdigo identicador de panteon. Clave primaria y Clave Ajena tomada de Tumba (ID_Tumba). ID_Familia: Cdigo identicador de familia Clave ajena tomada de Familiar (ID_Familia). Inscripcion: Texto que gura en el. Capacidad: Nmero de fallecidos que puede contener.

La entidad Factura tiene 5 atributos:


Cantidad: Total a pagar por la familia. Fecha: Fecha en que se emite la factura. Clave_Factura: Clave primaria (Fecha,ID_Familia,ID_Admin). ID_Familia: Cdigo identicador de familia. Clave ajena tomada de Familiar. ID_Admin:Cdigo identicador de Administrativo. Clave ajena tomada de Administrativo (DNI).

La entidad Fallecido tiene 7 atributos:


Nombre: Representar el nombre del fallecido. Apellidos: Contienen los apellidos del fallecido. FechaNacimiento: Almacena la fecha de nacimiento del fallecido. FechaMuerte: Almacena la fecha de la muerte del fallecido. Enterrador: Cdigo q identica al enterrador encargado del entierro. Clave Ajena tomada de Enterrador (DNI). ID_Familia: Cdigo q identica a la familia del fallecido. Clave Ajena tomada de Familiar (ID_Familia). Tumba: Cdigo q identica la tumba del fallecido. Clave Ajena tomada de Tumba (ID_Tumba).

Para la realizacin del esquema Entidad-Relacin, hemos utilizado una herramienta para el diseo de diagramas muy conocida por los usuarios de Linux como es Dia , se puede descargar en su versin para Windows 95/98/NT/ME/XP... de este web1 El nico inconveniente que hemos observado, es la notacin que utiliza para la representacin de los atributos, enmarcndolos en una elipse.Debido a esto, decidimos representar en el diagrama slo los atributos que son clave primaria (para consultar detalles sobre atributos, ver lista anterior)

12

Captulo 3. Describiendo el problema

Por lo que se reere a la especializacin de la entidad Empleado, podemos decir que consta de tres tipos: Jardinero, Enterrador y Administrativo. En cuanto a la ligadura, diremos que se trata de conjuntos de entidades disjuntos cuya ligadura de completitud es de tipo total, posee adems un atributo llamado Tipo que identica cada una de las tres categoras. La entidad Tumba tambin posee una especializacin en la que se diferencian tres tipos de subclases, a saber: Nicho, Panten y Fosa Comn, se trata de entidades disjuntas cuya participacin es total, al pasarlo a tablas aparecer un atributo en la tabla Tumba q identicar el tipo de Tumba de q se trata.

Construyendo las tablas


Una vez obtenido el esquema relacional es sencillo pasarlo a tablas. Nos ayudaresmo de PgAccess, una aplicacin grca que permite gestionar Postgres de un modo sencillo. Ms adelante comentaremos un poco PgAccess En la gura no indicamos campos no nulos ni las claves primarias. De cualquier modo, el resultado es lo bastante claro como para hacernos una idea de la estructura que tendr la bbdd. 13

Captulo 3. Describiendo el problema

14

Captulo 3. Describiendo el problema

15

Captulo 3. Describiendo el problema Una vez conseguido este esquema pasamos a plasmarlo a comandos SQL. El resultado se puede observar en este chero2.

Consultando nuestra Base de Datos


En esta seccin mostraremos la manera de realizar consultas en la base de datos cementerio mediante unos ejemplos, tomados bien como capturas de Putty para ilustrar la posibilidad de administracin remota, bien como salida de pantalla . Como primer ejemplo pondremos una captura directamente de Putty de una consulta que muestra todos los campos de la tabla Familiar.

A continuacin mostramos otra captura tomada tambin de Putty en la que se relacionan nombres y apellidos de Familiares y Fallecidos, como puede observarse, es una consulta que afecta a dos tablas relacionadas por el campo ID_Familia.

Un ejemplo de lo laborioso que puede resultar hacer una consulta para conocer el Dni del enterrador que se ocup de un fallecido llamado Restituto
cementerio=# select Fallecido.Nombre, Fallecido.Apellidos, Enterrador.Dni cementerio-# From Fallecido INNER JOIN Enterrador cementerio-# ON Fallecido.Enterrador = Enterrador.Dni cementerio-# WHERE Fallecido.Nombre = Restituto; nombre | apellidos | dni

-----------+----------------+---------Restituto | Gracia de Dios | 10657493 (1 row)

Ejemplo que muestra la salida de una consulta para listar el nombre de aquellos enterradores cuyo sueldo sea superior a 1600 Euros
cementerio=# select Nombre, Apellidos, Salario cementerio-# FROM Enterrador

16

Captulo 3. Describiendo el problema

cementerio-# WHERE Salario > 1600; nombre | apellidos | salario

---------+-------------------+--------Marc | Prez | 1800.00

Gonzalo | Gonzlez Gonzlez | 1900.00 Luis Frutos (4 rows) | Ant Bajo | Rojo del Bosque | 1750.00 | 1869.25

Veamos ahora el uso de Alias para las columnas, mientras que en SQL es suente con ponerlo a continuacion del campo o con comilla doble, en PostgreSQL es necesario utilizar as de la siguiente manera:
cementerio=# SELECT Nombre as "Nombre de Pila", Apellidos,Dni as "Cdigo Indentificador" cementerio-# FROM Enterrador; Nombre de Pila | apellidos | Cdigo Indentificador

----------------+-------------------+----------------------Jun Felipe Marc Jacinto Gonzalo Luis Frutos (6 rows) | Garca Sierra | Prez | Rodrguez Lpez | 71659874 | 71545545 | 10657493

| Gonzlez Gonzlez | 71234321 | Ant Bajo | Rojo del Bosque | 9632236 | 10653298

Consideraciones nales
En este apartado, trataremos temas como la semntica no reejada en el diseo, los controles que se realizan mediante la aplicacin de acceso a la base de datos as como todos aquellos aspectos y consideraciones que no tienen cabida en otros apartados.

Observaciones
Como puede apreciarse en el esquema, los fallecidos estn relacionados tanto con Nicho como con Panten y Fosa Comn, esto nos oblig a crear la tabla Tumba con un campo llamado Tipo que indicar si la tumba en cuestin es Nicho, Panten o Fosa Comn. Este campo resulta muy til para realizar consultas que necesiten saber el tipo de enterramiento. No hemos considerado la posibilidad de que una familia pueda ser la propietaria del nicho de su familiar fallecido, dejando esta relacin slo para los panteones. Obviamente no ha sido por comodidad, pues el trabajo aadido sera nmo, sino que lo 17

Captulo 3. Describiendo el problema que nos interesaba era conseguir la mayor variedad posible dentro de unos lmites razonables. Adems de lo anterior, decidimos que el entierro en fosa comn no generase una factura, siendo este un servicio gratuito. Aunque quiz fuera ms propio decir esto en el apartado de conclusiones nales y a pesar de que se ha mencionado en varias ocasiones,hemos de hacer hincapi en la forma de trabajo conjunta entre las dos mquinas, una con Linux RedHat 8.0 (donde est alojada la base de datos y el resto del material del trabajo) y otra con Windows 98 desde donde se pueden realizar las tareas necesarias para administrar la base de datos y trabajar en la documentacin (haciendo algn que otro malabarismo).

Semntica no reejada
Como puede apreciarse viendo tanto el modelo de Entidad-Relacin como el diagrama de tablas, pueden darse casos un tanto extraos como que a dos fallecidos se les asigne el mismo nicho. Tambin se puede exceder la capacidad tanto de Panteones como de Fosas Comunes, no obstante estos problemas son controlados mediante software por la aplicacin en Python pycemen, as nos aseguramos de que un nicho slo pueda estar ocupado por un fallecido, que un panten pueda contener como mximo a 6 (pueden ser menos) personas as como que una fosa comn albergue un mximo de 200 personas (pueden ser menos). Asmismo se observa que los fallecidos pueden pasar indistintamente a un Nicho, Fosa Comn o Panten, sin que aparentemente haya una razn para decidir mas all de las econmicas o de cualquier otro tipo.

Notas
1. http://dia-installer.sourceforge.net/ 2. ../others/cemen_check.sql.html

18

Captulo 4. Pgaccess: La herramienta grca de PostgreSQL


Introduccin a Pgaccess
Hasta ahora, hemos realizado toda la conguracin de Postgres mediante rdenes en una lnea de comandos. Esto suele intimidar a algunos usuarios (los no acostumbrados a sistemas Unix). Para ellos se desarroll una potente herramienta, llamada pgaccess. Est programado utilizando las libreras tcl/tk por lo que puede correr en cualquier plataforma a la que haya sido portado tcl/tk (Windows, Unix, Mac...). Pgaccess es libre como todo el software que estamos utilizando. Si quiere ms informacin puede consultar su pgina en pgaccess.org1. Un detalle importante para utilizar pgaccess es que a la hora de poner en marcha el servidor Postgres hemos de habilitar conexiones a dicho servidor por TCP/IP, ya que pgaccess utiliza este tipo de conexin. El modo de hacer esto es aadir el parmetro -i al iniciar el servidor.
Pgaccess permite hacer casi de todo. Desde crear tablas y modicarlas hasta realizar

esquemas de la bbdd. Nosotros slo veremos una pequea muestra de su potencia. Incluso incluye un diseador visual para realizar consultas, uno de formularios y otro de informes. Aqu est la pantalla que muestra las tablas presentes en nuestra bbdd cementerio:

19

Captulo 4. Pgaccess: La herramienta grca de PostgreSQL

Utilizando Pgaccess
Veamos ahora de lo que es capaz pgaccess. Vamos a realizar una sencilla consulta para averiguar qu enterradores han enterrado a qu muertos. Segn nuestro esquema, esto implica una consulta sobre dos tablas, la de fallecidos y la de muertos. Arrancamos el generador visual de consultas y arrastramos los campos que necesitamos al formulario:

20

Captulo 4. Pgaccess: La herramienta grca de PostgreSQL

Una vez congurada nuestra consulta, podemos ver la sentencia SQL resultante o ejecutarla directamente. Los resultados se presentan del siguiente modo:

21

Captulo 4. Pgaccess: La herramienta grca de PostgreSQL

Esta era una consulta sencilla. Supongamos ahora que algn familiar visita el cementerio. Querr saber dnde est enterrado su pariente. Realizaremos ahora una vista ya que esta parece una situacin habitual. ste ser el esquema que diseemos para implementar esta consulta:

22

Captulo 4. Pgaccess: La herramienta grca de PostgreSQL

El cdigo SQL resultante de esta consulta sera:


select t0."nombre", t0."apellidos", t1."nombre", t1."apellidos", t2."id_tumba", t2."tipo", t3."nombre" from "fallecido" t0,"familiar" t1,"tumba" t2,"sector" t3 where (t2."id_tumba"=t0."tumba") and (t3."id_sector"=t2."sector") and (t1."id_familia"=t0."id_familia")

Los resultados de esta consulta sern: 23

Captulo 4. Pgaccess: La herramienta grca de PostgreSQL

Esto es slo una pequea muestra de lo que pgaccess puede hacer. No comentaremos aqu el editor de formularios, el de "Reportes" (ms bien informes), el de grcas etc.

Notas
1. http://www.pgaccess.org

24

Captulo 5. Accediendo mediante software: Pycemen


Por qu Python?
Python1 es un lenguaje interpretado, orientado a objetos de propsito general. Python

permite mantener de forma sencilla interaccin con el sistema operativo, y resulta muy adecuado para manipular archivos de texto. Est disponible en MS-Windows, GNU/Linux, Mac y cualquier entorno *IX. Python es un lenguaje de scripts, sencillo pero potente. Hablamos de scripts pero...qu es un script? Un script es un conjunto de instrucciones que se ejecutan paso a paso, instruccin a instruccin. Esto signica que Python no genera ejecutables, si no que es Python el encargado de ejecutar nuestro cdigo. Es por tanto un lenguaje interpretado, no compilado. Esto le dota de ventajas, pero tambin de algunos inconvenientes: Ventajas

Desarrollo ms rpido : Puedes escribir un programa, salvarlo y ejecutarlo. En un lenguaje compilado tienes que pasar por los pasos de compilar y ligar el software, lo cual puede ser un proceso lento. Multiplataforma : El mismo cdigo funciona en cualquier arquitectura, la nica condicin es que disponga del intrprete del lenguaje. No es necesario compilar el cdigo una vez para cada arquitectura.

Inconvenientes

Lentitud : Los programas interpretados son ms lentos que los compilados. Sin embargo los programas interpretados suelen ser cortos, en los que la diferencia es inapreciable.

Si desea saber ms sobre Python puede consultar Introduccin a Python2

Comentando el programa
Funcionalidades de Pycemen
Lo primero, puede verse el cdigo del programa en este link3. La nica funcionalidad de Pycemen es aadir datos a la bbdd. Lo que no es poco. Por ejemplo. Algo sencillo como la adicin de un panten a la base de datos. El programa averigua un cdigo ID_Tumba vlido. Cmo? Realizando una consulta a la bbdd, interpretando los resultados y calculando un nmero que sirva (en este caso no es ms que sumarle 1 al ltimo ID_Tumba que exista). Una vez tengamos nuestro ID_Tumba, es necesario saber en qu sector va a ser emplazado. Para ello se realiza 25

Captulo 5. Accediendo mediante software: Pycemen una consulta en la tabla de sectores y se muestran por pantalla dejando al usuario que decida uno vlido. Adems es necesario conocer a qu familiar se le va a asociar dicho panten. Y muchos detalles ms. Otro detalle importante es que Pycemen no slo aade datos en la bbdd, sino que tambin guarda todas las sentecias SQL de adicin de datos que ejecuta. Esto era especialmente importante para nosotros, ya que al ser poco expertos tanto en PostgreSQL como en SQL en ocasiones cometamos errores que no sabamos corregir. Como guardbamos un log con todas las sentencias introducidas, nunca tuvimos que lamentar prdidas de datos (que aunque cticios, importantes por lo aburrido que resulta aadirlos). Como ejemplo ms claro de esto mostramos el siguiente4 chero generado enteramente por Pycemen.

Pycemen en accin

Vamos a echar un vistazo al funcionamiento al programa. Aunque la versin nal puede cambiar (al menos la interfaz) las rutinas que subyacen ya estn programadas y funcionan bastante bien (o eso creemos). Veamos cmo es el proceso de aadir un nuevo nicho a nuestra bbdd. Lo primero es acceder al men de adicin de datos, tras lo cual seleccionamos la opcin de aadir una nueva tumba.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

1.- Aadir Enterradores 2.- Aadir Administrativos 3.- Aadir Jardineros 4.- Aadir Tumbas 5.- Aadir Sectores 6.- Aadir Familiar 7.- Aadir Facturas 8.- Aadir Fallecidos 0.- Salir

Seleccione una opcin >>> 4

Al seleccionar aadir tumba, el programa calcula un nuevo ID_Tumba que sea coherente con los ya presentes anteriormente y lo muestra en pantalla. A continuacin averigua los sectores del cementerio y nos pide que seleccionemos aquel en el que va a ser emplazado el nuevo nicho:
ID_Tumba ---> 35 1 Patio de la redencin 2 Olvidados del Seor 3 Patio de San Froiln 4 Patio Real 5 La Asuncin 6 Los Inocentes 7 Patio de San Isidoro 8 San Judas Tadeo 9 Virgen del Camino 10 El Expolio 11 La Crucifixin Sector ---> 8

26

Captulo 5. Accediendo mediante software: Pycemen Ahora se nos preguntar el tipo de tumba que queremos aadir (nicho, paten o fosa comn, nicho en este caso), la inscripcin visible en el nicho y la altura de ste.
Tipo ---> Nicho Inscripcin ---> Eternamente Vivo Altura ---> 3 Presione INTRO para continuar

Y ya hemos aadido el nicho. Si observamos el chero de log donde guardamos todas las sentencias SQL de adicin de datos, podemos ver:
insert into Tumba Values (35, Nicho ,8); insert into Nicho Values (3,35,Eternamente Vivo);

Y haciendo una consulta a la bbdd:


cementerio=# select id_nicho, altura, inscripcion cementerio-# from nicho cementerio-# order by id_nicho; id_nicho | altura | inscripcion ----------+--------+-----------------1 | 1 | 4 | 2 | Salud 27 | 3 | Adis Camaradas 30 | 2 | er 32 | 2 | 34 | 2 | 35 | 3 | Eternamente Vivo (7 rows)

Este es uno de los ejemplo ms sencillos. Se pueden dar situaciones ms complicadas como la adicin de un fallecido que vaya a ser enterrado en un nicho. En este caso tendremos que cumplimentar adems una factura entre otros detalles. Sera algo como esto:
Aadiendo Fallecido Nombre ---> Marcos Apellidos ---> Robles de la Huerta Fecha Nacimiento ---> 4/5/56 Fecha Defuncin ---> 9/9/02 DNI ---> 9888888 Seleccione Identificador de Enterrador 715451632 Sergio Diez Garca - Olalla 9248635 Luis Fernndez Prez 71659874 Juan Felipe Garcia Sierra 71632587 Ral Gmez de la Huerta 71585696 scar Gonzlez Prado 9875651 Pedro Mrquez Ruiz 09823456 Segundo Toro de la Tarde Enterrador ---> 715451632 Tipo de Tumba ---> nicho

Hasta aqu todo sencillo. Tan slo una sencilla consulta para ver los enterradores que tenemos en nmina. Ahora y dado que el fallecido ir a parar a un nicho, hemos de cumplimentar los datos de los familiares. Pude darse el caso de que el familiar que pague la factura sea diferente al que aparezca ligado al fallecido(por ejemplo, en caso de accidente de trco, en la factura aparecer la compaa de seguros). Puede ser que el familiar ya est en nuestra bbdd o puede ser que no. El programa presenta los posibles familiares y pregunta si se desea aadir una nueva entrada en la tabla de familiares:
Seleccione Identificador de Familia 3 Rubn Blanco Gmez 5 Pipo Calceda

27

Captulo 5. Accediendo mediante software: Pycemen


1 Josu Cordera Lez 4 Mara de los Dolores Fuertes de Cabeza 2 Nuria Gonzlez Desea aadir nueva familia? (S/N) n Familia ---> 5

Ahora es el momento de cumplimentar la factura. Se observa el caso que comentamos anteriormente, que en los datos de la factura aparezca un familiar diferente:
Aadiendo Factura Cantidad ---> 2000.99 Fecha ---> 9/9/02 Seleccione Identificador familiar 3 Rubn Blanco Gmez 5 Pipo Calceda 1 Josu Cordera Lez 4 Mara de los Dolores Fuertes de Cabeza 2 Nuria Gonzlez Desea aadir nueva familia? (S/N) n Familia ---> 5 Seleccione Identificador de Administrativo 9444555 Javier Alto del Cerro 71654321 Joselito de Pequeos Ruiseores 9636525 ngeles de todos los Santos Ruiz 71440439 Lucas Feo Gutierrez 71569874 Juaz Gonzlez Mrquez Administrativo ---> 9636525 Presione INTRO para continuar

Ahora que ya hemos cumplimentado e introducido la factura, es hora de elegir un nicho para el difunto. Para ello el programa selecciona de los nichos existentes, los que estn libres:
Nicho 27 Nicho 32 Nicho 34 Nicho 35 Nicho Presione libre. Inscripcin: libre. Inscripcin: libre. Inscripcin: libre. Inscripcin: ---> 34 INTRO para continuar Adis Camaradas Ninguna Ninguna Eternamente Vivo

Fcil, no?

Por qu una interfaz basada en texto?


Se nos ocurren diversas respuestas a esta pregunta, pero slo comentaremos las dos ms importantes:

Slo permitimos accesos locales a la bbdd (precisamente por esto hemos venido usando OpenSSH, para permitir accesos locales desde mquinas remotas. Esta decisin responde a diversas razones, principalmente la seguridad (no somos expertos en PostgreSQL como para permitir a cualquiera el acceso a la bbdd). Bien, ya que todo lo que hagamos se ejecutar en la mquina remota, pensemos que ocurrira si tuvisemos un programa que se ejecutase grcamente. Nosotros en la mquina remota tendramos que recibir toda la informacin grca de la aplicacin (ventanas, botones, imgenes...) a travs de la red. Esto es factible y perfectamente posible en redes LAN con velocidades de 10 Mbps. 5 . Sin embargo a travs de una WAN (internet), siendo la velocidad de subida de la mquina que ejecuta el programa de 128Kbps esto no es posible. Velocidad de desarrollo: Hemos preferido aadir funcionalidades a la aplicacin que disear una interfaz grca de usuario (que al n y al cabo nadie iba a usar). Esta decisin nos ha permitido utilizar el programa an en fase muy primitiva de

28

Captulo 5. Accediendo mediante software: Pycemen desarrollo para aadir datos a la bbdd. Siempre es ms cmodo que las sentencias SQL.

Notas
1. http://www.python.org 2. http://users.servicios.retecal.es/tjavier/python/intpython/index.html 3. ../others/cemen.py.html 4. ../others/pycem.dat.html 5. Una muestra se puede ver en 6. http://bulmalug.net/body.phtml?nIdNoticia=1588 . 6. http://bulmalug.net/body.phtml?nIdNoticia=1588

29

Captulo 5. Accediendo mediante software: Pycemen

30

Captulo 6. Conclusiones nales


Despus de haber trabajado algo ms de un mes con PostgreSQL nos damos cuenta de que es una herramienta mucho ms potente y completa de lo que se pudiera pensar en un principio. Hemos empezado de cero, sin apenas haber oido hablar de este gestor (la publicidad la tienen Oracle y MySQL). Rpidamente buscamos en su web instrucciones de cmo instalarlo. Al poco nos dimos cuenta que en los cds de casi cualquier distribucin de Linux vena incluido. Una vez instalado, empezamos a trabajar con l. Entonces nos surgi el problema de que una base de datos no es algo tan portable como el cdigo fuente de un programa o un documento, no podamos meterlo en un disquete o zipearla y enviarla para ver los progresos se cada uno. Tenamos que encontrar el modo de trabajar concurrentemente sobre una base de datos (que al n y al cabo es uno de los objetivo de los gestores de bases de datos). En tonces se nos ocurri utlizar conexiones mediante ssh. As podamos trabajar sobre la misma base de datos alojada en el ordenador de uno de nosotros. Una vez resueltas con xito estas cuestiones, empezamos a trabajar en el problema que nos habamos propuesto. Tras realizar el diagrama Entidad-Realacin y pasarlo a tablas, comenzamos a codicarlo en SQL. Aqu se nos present otro problema. An no sabamos nada de SQL (slo habamos creado bbdd con asistentes visuales de MS-SQLSever). Entonces con paciencia, manuales y tirando de google hicimos un pequeo boceto. Especialmente traumtico fue comprender el uso de los CONSTRAINS para las claves ajenas 1 . Una vez comprendimos esto, hicimos un primer boceto en SQL de nuestra bbdd, que ya inclua tipos de datos y claves primarias y ajenas. Esto nos dara pie a poder empezar a desarrollar el programa que accediera ella. Tras aadir muuuuchos datos (siempre a travs de sentencias SQL) empezamos el desarrollo del programa. Elegimos el lenguaje de programacin Python, por conocerlo previamente y por lo que necesitbamos en este momento: velocidad de desarrollo y una gran interconectividad con Postgres 2 . El programa avanzaba rpidamente. Decidimos que su nica funcionalidad sera la de aadir datos. Que no era una tarea sencilla, debido sobre todo al gran nmero de relaciones entre las tablas. Por no multiplicar lneas de cdigo, decidimos no realizar demasiadas comprobaciones de error en los datos introducidos. Ya se encargara de protestar Postgres. A medida que avazbamos nuestros conocimientos en SQL crecan. Realizbamos consultas complejas y empezamos a mejorar el diseo inicial de la bbdd. Anamos un poco los tipos de datos obtenidos e introdujimos CHECK en muchos atributos y otros detalles. Luego descubrimos que pgaccess podra habernos ahorrado el trabajo de aprender tanto SQL pero siempre es ms importante conocer lo que hay que hacer, que dejar a una aplicacin que lo haga (sobre todo si no sabemos exactamente lo que esta aplicacin hace). Sin embargo hubiera estado bien haber prestado ms atencin a pgaccess al principio. Qu hemos aprendido? Pues entre otras muchas cosas hemos aprendido a:

Instalar y congurar un servidor PostgreSQL en un entorno Linux Preparar una mquina Linux para permitir accesos remotos de modo seguro Programar una aplicacin que se conecta y utiliza una base de datos Un montn de SQL Utilizar una aplicacin grca como pgaccess para manipular una bbdd Escribir y compilar documentacion en DocBook/SGML

No queremos olvidarnos de comentar un ltimo detalle muy importante. Todas las aplicaciones que hemos utilizado son software libre (puedes redistribuirlo y modicarlo segn sus respectivas licencias) y est disponible de manera gratuita. El coste 31

Captulo 6. Conclusiones nales por software del problema que hemos descrito e implementado asciende a 0 euros. Eso s, la mano de obra ha de estar bien remunerada :-)

Notas
1. Es increble la cantidad de nombres que se les da a las claves ajenas: ajenas, extrajeras, forneas, externas, exteriores... 2. No slo de Python vive Postgres evidentemente. Existen mdulos de conexin a Postgres para C, Java, Perl, Pascal y un largo etctera.

32

Captulo 7. Por dnde sigo?


Toda la documentacin que hemos utilizado se encuentra en la web. Existen adems libros editados de PostgreSQL pero no hemos tenido tiempo de consultarlos (no estn en ninguna biblioteca ni librera, una pena). De todos modos, agradecemos a la gente de TLDP-ES/LuCAS1 la recopilacin del material referente a Postgres en castellano, as como el el Curso de Bases de Datos y PostgreSQL2.

Bibliografa

Notas
1. http://lucas.hispalinux.es/Postgresql-es/web/ 2. http://lucas.hispalinux.es/Tutoriales/NOTAS-CURSO-BBDD/notas-cursoBD/ 1. http://lucas.hispalinux.es/Tutoriales/NOTAS-CURSO-BBDD/notas-cursoBD/ 2. http://www.sindominio.net/ayuda/postgresql/tutorial-postgresql-1.html 3. http://lucas.hispalinux.es/Postgresql-es/web/navegable/tutorial/tutorial.html 4. http://www.asptutor.com/sql/ 5. http://www.dcc.uchile.cl/~raparede/cc42a/auxSQL/auxSQL.html 6. http://coqui.lce.org/mdejesus/?N=D 7. http://www.commandprompt.com/ppbook/index.lxp 8. http://www.postgresql.org/idocs/index.php?pygresql.html 9. http://www.python.org/doc/current/tut/tut.html 10. http://users.servicios.retecal.es/tjavier/python/intpython/index.html

33

Captulo 7. Por dnde sigo?

34

ndice
Apache, 1 BSD, 1 createdb, 4 Formularios, 24 Generador Visual de Consultas, 24 GPL, 1 initdb, 3 Interbase, 1 intrprete, 25 MySQL, 1 Oracle, 1 pgaccess, 20 php, 1 PostgreSQL, 1 PuTTY, 5 Pycemen, 26 Python, 25 RPM, 3 scripts, 25 SQL Server, 1 ssh, 5 Vistas, 24 WinSCP, 6

23. #AEN172

Notas
1. #INTRODUCCION 2. #INTRODUCCION 3. #AEN118 4. #AEN641 5. #AEN641 6. #INTRODUCCION 7. #AEN118 8. #INTRODUCCION 9. #AEN686 10. #INTRODUCCION 11. #INTRODUCCION 12. #AEN615 13. #INTRODUCCION 14. #INTRODUCCION 15. #AEN172 16. #AEN720 17. #AEN686 18. #AEN77 19. #AEN686 20. #INTRODUCCION 21. #AEN172 22. #AEN641 35

Вам также может понравиться