Академический Документы
Профессиональный Документы
Культура Документы
Un ejemplo sencillo
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
./configure
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
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
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:
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.
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.
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
Antigedad: Aos de servicio en la empresa. Salario: Sueldo en Euros . DNI: Contiene el nmero del DNI, es la clave primaria de esta entidad.
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.
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.
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.
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.
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.
ID_Fosa: Cdigo identicador de Fosa Comn. Clave primaria y Clave Ajena tomada de Tumba (ID_Tumba). 11
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.
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).
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
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.
14
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.
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
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
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
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
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
Una vez congurada nuestra consulta, podemos ver la sentencia SQL resultante o ejecutarla directamente. Los resultados se presentan del siguiente modo:
21
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
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
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.
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
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);
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
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?
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
30
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
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
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