Siguiente Anterior Contenido


10. El Driver de Interface de Base de datos Perl (DBI) para PostgreSQL

10.1 El interface Perl 5 para PostgreSQL

PERL es un acrónimo de 'Practical Extraction and Report Language' (Lenguaje práctico de extracción e informe). Perl se puede utilizar en todos y cada uno de los sistemas operativos y plataformas hardware del mundo. Usted puede usar Perl en Windows95/NT, iMac de Apple Macintosh, todas las variantes de Unix (Solaris, HPUX, AIX, Linux, SCO, etc) ordenadores centrales MVS, ordenadores de sobremesa OS/2, OS/400, Amdahl UTS y muchos otros. ¡Perl corre INCLUSO en muchos sistemas operativos y plataformas hardware poco populares o generalmente desconocidos! De modo que no se sorprenda si encuentra Perl corriendo en un sistema operativo muy ráramente usado. Puede usted imaginar la vasta extensión de la base de usuarios y desarrolladores de Perl.

La interface Perl para PostgreSQL está incluida en la distribución de PostgreSQL. Compruebelo en el directorio src/pgsql_perl5

10.2 El Interface para Bases de Datos de Perl DBI

¿QUÉ ES DBI ?

El Interface de Bases de Datos en Perl (DBI, Database Interface) es un Interface de Programación de Aplicaciones (API) para el lenguaje Perl. Las especificaciones del API DBI para Perl definen un juego de funciones, variables y convenciones que proporcionan un interface de base de datos consistente e independiente de la base de datos que se esté usando en ese momento. La información para esta sección DBI se ha obtenido del documento 'DBI FAQ' cuyo autor es Alligato Descartes, y lo reproducimos aquí con su permiso.

Driver DBI para PostgreSQL DBD-Pg-0.89

Consiga DBD-Pg-0.89.tar.gz en uno de los siguientes:

REQUERIMIENTOS:

Soporte técnico para DBI

Envíe por favor comentarios y avisos de error a

incluyendo por favor la salida de perl -v, y perl -V, la versión de PostgreSQL, la versión de DBD-Pg, y la versión de DBI en su aviso de error.

¿Qué son DBI, DBperl, Oraperl y *perl?

Tomado de Tim Bunce, el arquitecto y autor de DBI:

``"DBI es un Interface de Programación de Aplicaciones de Acceso a Bases de Dados (API) para el lenguaje Perl. La especificación del API DBI define un juego de funciones, variable y convenciones que proporcionan un interface de base de datos consistente e independiente de la base de datos que se esté utilizando"

En un lenguaje sencillo, la interface DBI permite a los usuarios acceder a múltiples tipos de bases de datos de modo transparente. Por ello, si usted está conectando a una Oracle, Informix, mSQL, Sybase, o cualquier otra base de datos, no necesita conocer los mecanismos subyacentes de lenguaje 3GL. La API definida por DBI trabajara en todos estos tipos de datos.

Un beneficio similar se consigue por la capacidad de conectar a dos bases de datos diferentes de vendedores diferentes con un único script en perl, es decir, yo quiero leer datos de una base Oracle e insertarlos en una Informix, y todo en un único programa. La capa DBI le permite hacer esto de una forma simple y poderosa.

DBperl es el nombre anterior para la especificación del interfe. Habitualmente, se utiliza ahora para referirse a los módulos perl4 para acceso a bases de datos, tales como oraperl, isqlperl, ingperl y demás. Estos interfaces no tienen una API estandar y generalmente no están soportados.

Aquí tiene una lista de módulos DBperl, sus correspondientes contrapartidas DBI, e información de soporte. Las preguntas sobre drivers DBI deberían dirigirse a las listas de correo de usuarios de DBI.

    Módulo      Base de datos       Autor                   DBI
    ----------- -----------------   ------                  ---
    Sybperl     Sybase              Michael Peppler         DBD::Sybase
                                    <mpeppler@datamig.com>
                                    http://www.mbay.net/~mpeppler
    Oraperl     Oracle 6 & 7        Kevin Stock             DBD::Oracle
                                    <dbi-users@fugue.com>
    Ingperl     Ingres              Tim Bunce &             DBD::Ingres
                                    Ted Lemon
                                    <dbi-users@fugue.com>
    Interperl   Interbase           Buzz Moschetti          DBD::Interbase
                                    <buzz@bear.com>
    Uniperl     Unify 5.0           Rick Wargo              None
                                    <rickers@coe.drexel.edu>
    Pgperl      Postgres            Igor Metz               DBD::Pg
                                    <metz@iam.unibe.ch>
    Btreeperl   NDBM                John Conover            SDBM?
                                    <john@johncon.com>
    Ctreeperl   C-Tree              John Conover            None
                                    <john@johncon.com>
    Cisamperl   Informix C-ISAM     Mathias Koerber         None
                                    <mathias@unicorn.swi.com.sg>
    Duaperl     X.500 Directory     Eric Douglas            None
                User Agent

Sin embargo, algunos módulos DBI tienen capas de emulación de DBperl, así, DBD::Oracle viene con una capa de emulación Oraperl, que le permite correr scripts oraperl heredados sin modificaciones. La capa de emulación traduce las llamadas del API oraperl a llamadas de DBI y las ejecuta a través del enlace DBI.

Aquí hay una tabla de información sobre las capas de emulación:

    Módulo          Capa de Emulación   Situación
    ------          -----------------   ---------
    DBD::Oracle     Oraperl             Completa
    DBD::Informix   Isqlperl            En desarrollo.
    DBD::Sybase     Sybperl             ¿Trabajando?(Necesita verificación)
    DBD::mSQL       Msqlperl            Liberado experimentalmente con
                                        DBD::mSQL-0.61

La emulación Msqlperl es un caso especial. Msqlperl es un driver en perl5 para bases de datos mSQL, pero no se ajusta a la especificación DBI. Su uso está siendo abandonado en favor de DBD::MSQL. Se puede descargar Msqlperl desde CPAN a travé de:

Especificaciones DBI

Hay algunas fuentes de información sobre DBI:

Hay dos especificiaciones utilizables en este enlace, la nueva especificación DBI Draft, que es un documento en rápida evolución que el equipo de desarrollo dirige hacia una interface estable, y la histórica Especificación DBperl, desde la que ha evolucionado la actual interface DBI.

El documento anterior debería se visto solo por su interés histórico, y no debería servir como un manual de programación, ni documentación autorizada en ningún sentido. Sin embargo, sigue siendo muy utilizable como fuente de referencias.

Documentación POD (N. del T.: ¿Piece of Documentation?). Los PODs son trozos de documentación habitualmente embebidos en los programas en perl, que documentan el código "en el sitio", proporcionando un recurso utilizable por los programadores y usuarios de los módulos. Los POD para DBI y los driver están empezando a volverse lugares comunes, y la documentación para estos módulos puede leerse con los siguientes comandos:

El POD para la especificación DBI se puede leer con el comando

perldoc DBI

Los usuarios de Oraperl y la capa de emulación Oraperl incluída en DBD::Oracle, pueden leer sobre como programar con la interface Oraperl tecleando:

perldoc Oraperl

Esto producirá una copia actualizada de la página man sobre oraperl original, escrita por Kevin Stock para perl4. La API oraperl está listada y descrita completamente ahí.

Los usuarios del módulo DBD::mSQL pueden leer sobre algunas de las funciones privadas y las peculiaridades de ese driver tecleando:

perldoc DBD::mSQL

Las Preguntas más Frecuentemente Respondidas (FAQ) están utilizables como documentación POD. Léalas tecleando:

perldoc DBI::FAQ

Esta alternativa puede ser más conveniente para personas que no están permanentemente, o adecuadamente, conectadas a internet.

Los POD sobre información general para escribir POD, y la filosofía de los POD en general, se puede leer tecleando:

perldoc perlpod

Los usuarios con el módulo Tk instalado pueden estar interesados en un lecto de POD basado en Tk, llamado tkpod, que formatea los POD en una forma conveniente y legíble.

Hay una serie de aproximaciones ocasionales de varias personas en las listas de correo de DBI.

"DBI -- El Interface de bases de datos en perl5" es un articulo escrito por Alligator Descartes y Tim Bunce sobre la estructura de DBI. Se publico en el fascículo 5 de "The Perl Journal". Es extremandamente bueno. Compre la revista. De hecho, cómprelos todos. La página Web de "The Perl Journal" está en:

``"DBperl" Este artículo publicado en la edición de Noviembre de 1.996 de "Dr. Dobbs Journal" se refiere al DBperl.

"The Perl5 Database Interface": Es un libro escrito por Alligator Descartes y publicado por O'Reilly y asociados.

Hay tres listas de correo sobre la ejecución de DBI de Ted Lemon. Se pueden subscribir y desubscribir a través de la WWW en

Las listas en las que pueden participar los usuarios son:

dbi-announce Esta lista de correo es sólo para anuncios. Si usted no puede utilizar adecuadamente el formato de la página www correspondiente, suscribase enviando un correo-e a la dirección:

dbi-dev Esta lista de correo está dedicada al uso de desarrolladores dicutiendo sobre ideas y conceptos sobre la mecánica de drivers, interface DBI y API. Utilizar sólo para desarrolladores o personas interesadas. Si usted no puede utilizar adecuadamente el formulario de la página www anterior, subscríbase enviando un correo-e a la dirección:

dbi-users Esta lista de correo es una lista de propósito general, utilizada para notificar errores, discutir problemas y preguntas de tipo general. Si usted no puede utilizar adecuadamente la página www anterior, subscríbase enviando un correo-e a la dirección:

Archivos de listas de correo:

Problemas de compilación o "It fails the test"

Si se le produce un volcado de memoria (core dump), intente con el módulo Devel::CoreStack para generar un rastro de la pila a partir del volcado de memoria. Puede encontrar Devel::CoreStack en CPAN, en:

Envíe a las listas de correo dbi-users es rastro de la pila, las versiones de los módulos, la versión de perl, el juego de pruebas, versiones de sistema operativo y cualquier otra información que considere pertinente. Cuanta más información envíe, más rápido podrán resolver su problema los desarrolladores. Si no nos envía nada, no espere nada.

¿Se soporta DBI bajo plataformas Windows 95 / NT?

Las migraciones de DBI y DBD:Oracle para Windows de 32 bits son ahora una parte estandar del DBI, de modo que descargando una versión de DBI superior a la 0.81, debería trabajar adecuadamente. Podrá usted acceder a las bases Microsoft Access y SQL-Server desde DBI a través de ODBC. Con las versiones de DBI 0.79 y posteriors una 'capa de emulación' experimental para el módulo Win32::ODBC. Se llama DBI::W32ODBC. Necesitará el módulo Win32::ODBC.

¿Qué es DBM? ¿Y porqué utilizar entonces DBI?

UNIX fué dotado originariamente con unas "bases de datos" sencillas basadas en ficheros, llamadas "el sistema dbm". Dbm le permitía almacenar datos en ficheros, y recuperarlos rápidamente. Sin embargo, también tenían serios problemas.

Bloqueo de ficheros.

Los sistemas dbm no permitían capacidades de bloqueo de ficheros particularmente robustas, ni niguna capacidad de corregir problemas surgidos de escrituras simultáneas [en la base de datos].

Estructuras de datos arbitrarios.

Los sistemas dbm solo permitían una estructura de datos fija: los pares clave-valor. Ese valor podría ser un objeto complejo, tal como una estructura [C], pero la clave debía ser única. Esto era una gran limitación sobre la utilidad de los sistemas dbm.

Sin embargo, los sistemas dbm también proporcionaban una función utilizable por los usuarios con juegos de datos sencillos y recursos ilimitados, puesto que era rápida, robusta y extremadamente bien comprobada. Los módulos perl para acceder a sistemas dbm han sido integrados ahora en el núcleo de la distribución de Perl, a través del módulo AnyDBM_File.

Además to todo esto, DBM es una solución perfectamente satisfactoria para bases de datos esencialmente de sólo lectura, o juegos de datos pequeños y sencillos. Sin embargo, para juegos de datos más potentes y escalables, no se puede mencionar bloqueos transaccionales robustos, a los usuarios se les recomienda usar DBI.

¿Está soportada por DBI <ponga_aquí_su_característica>?

Dado que hacemos el supuesto de que la característica por la que está usted preguntando una característica no estandar de una base de datos específica, la respuesta será que no.

DBI refleja una API genérica que trabajará para la mayoría de las bases de datos, y no tiene funcionalidades específicas de una base de datos.

Sin embargo, los autores de los drivers pueden, si lo desean, incluir enlaces a funcionalidades específicas de una base de datos a través de los métodos de funciones definidas en la API DBI. Los desarrolladores de scripts deberían tener en cuenta que el uso de funcionalidades proporcionadas a través de los métodos de funciones no son deseables si se desea portabilidad a distintas bases de datos.

¿Se puede programar DGI usando DBI?

En una palabra, ¡si! ¡DBI es completamente utilizable para programar CGI! De hecho, la programación de CGI es uno de los dos usos mayores de DBI.

DBI confiere a los programadores de CGI la capacidad de ofrecer a sus usuarios bases de datos accedidas por WWW, lo que aporta a los usuarios vastas cantidades de datos ordenados para manejarlos. DBI también proporciona la posibilidad de que, si en un lugar se está recibiendo demasiado tráfico, entonces sus servidores de bases de datos pueden hacerle frente, pueden actualizar el servidor de base de datos desacoplando las escenas sin alteraciones de los scripts de CGI.

¿Cómo puedo acelerar la conexión con DBD Oracle y CGI?

El servidor de http Apache mantiene un conjunto de demonios http hijos (httpd) para servir los requerimientos de los clientes. Utilizando el módulo mod_perl de Apache, de Doug MacEachern, el interprete de perl está embebido en el hijo httpd. El CGI, DBI y sus otros módulos favoritos pueden ser cargados en el arranque de cada hijo. Estos módulos no resran recargados a menos que se cambien en el disco. Para más información sobre Apache, vea el sitio Web del proyecto Apache:

¿Cómo puedo hacer conexiones persistentes con DBI y CGI?

Utilizando el módulo Apache::DBI de Edmund Mergl, el login a la base de datos se almacena en un todo con cada uno de estos hijos httpd. Si su aplicación está basada en un único usuario de base de datos, esta conexión puede arrancarse para cada hijo. Actualmente, no se pueden compartir conexiones a base de datos entre hijos httpd. Se puede descargar Apache::DBI desde CPAN a través de:

"¡Cuando ejecuto un script perl desde la línea de comandos, funciona, pero cuando lo ejecuto bajo httpd, falla!" ¿Porqué?

Básicamente, una buena posibilidad de que esto ocurra se debe al hecho de que el usuario con el que usted ejecutó la línea de comando tiene bien configurado el juego de variables de entorno, en el caso de DBD::Oracle, variables como $ORACLE_HOME, $ORACLE_SID, o TWO_TASK. El proceso httpd usualmente corre bajo el usuario nobody, lo que implica que no hay entorno configurado. Cualquier script que se intente ejecutar en esta situación fallará. Para resolver este problema, coloque el entorno de su base de datos en un bloque BEGIN ( ) al principio de su script. Esto resolverá el problema. Similarmente, debería usted chequear su fichero de errores de httpd para todas las indicaciones, así como la "Guía de Idiotas para Resolver Problemas en Perl / CGI", y la "FAQ programando Perl y CGI" para posterior información. Es improbable que esto sea un problema relacionado con DBI. ¡Lea AMBOS documentos cuidadosamente!

¿Cómo puedo programar en multi-hebra con DBI?

En este momento, no puede. Perl no soporta multi-hebras. Sin embargo, el soporte para multi-hebras se espera que forme parte de la distribución del núcleo de perl con la versión 5.005, lo que implica que DBI pueda soportar multi-hebrado muy poco tiempo después. Para ver algunos ejemplo de codigo OCI con instrucciones SELECT con multi-hebrado para Oracle, vea:

¿Cómo puedo invocar procedimientos almacenados con DBI?

Asumiendo que ha creado usted un procedimiento almacenado dentro de la base de datos, por ejemplo una base de datos Oracle, puede utilizar $dbh->do para ejecutar inmediatamente el procedimiento. Por ejemplo,

$dbh->do( "BEGIN mi_procedimiento END" );

¿Cómo puedo recoger valores devueltos pro procedimientos almacenados con DBI?

¡Recuerde realizar la comprobación de errores!

    $sth = $dbh->prepare( "BEGIN foo(:1, :2, :3); END;" );
    $sth->bind_param(1, $a);
    $sth->bind_param_inout(2, \$path, 2000);
    $sth->bind_param_inout(3, \$success, 2000);
    $sth->execute;

¿Cómo puedo crear o borrar una base de datos con DBI?

La creación y borrado son conceptos que están enteramente abstractos para ser adecuadamente soportados por DBI. Por ejemplo, Oracle no soporta el concepto de borrado de una base de datos por completo. Además, en Oracle, el servidor de base de datos es esencialmente la misma base de datos, mientras que en mSQL, el proceso servidor de base de datos funciona adecuadamente sin tener ninguna base de datos creada. El problema es demasiado dispar para atacarlo. Algunos drivers, sin embargo soportan la creación y el borrado a través de los métodos de funciones privadas. Debería usted chequear la documentación para los drivers que está usted utilizando para ver si soportan este mecanismo.

¿Cómo manipula los valores NULL DBI?

Los valores NULL están especificados en DBI como valores indefinidos. Se pueden insertar valores nulos en las bases de datos como NULL. Por ejemplo:

    $rv = $dbh->do( "INSERT INTO table VALUES( NULL )" );

pero cuando se recupera el valor, los nulos se deberían comprobar como undef. Este es un estandar en todos los drivers.

¿Qué son estos métodos de funciones tan mencionados?

Los método de funciones (func method) se define en DBI como un punto de entrada para funcionalidades específicas de la base de datos, por ejemplo, la capacidad de crear y borrar bases de datos. Invocar estos métodos específicos del driver es sencillo, por ejemplo, para invocar un método createDatabase que tiene un argumento, escribiríamos:

    $rv = $dbh->func( 'argumento', 'createDatabase' );

Los desarrolladores de software deberían tener en cuenta que estos métodos de función no son portables entre bases de datos.

Soporte comercial y formación.

El interface de base de datos Perl5 es software LIBRE. VIENE SIN GARANTÍA DE NINGÚN TIPO. Sin embargo, algunas organizaciones están proporcionando bien soporte técnico, bien programas de formación en DBI.

PERL CLINIC : The Perl Clinic puede organizar contratos de soporte comercial para Perl, DBI, DBD::Oracle y Oraperl. El soporte se proporciona a través de la compañía en la que trabaja Tim Bunce, autor de DBI. Para más información sobre sus servicios, visite por favor:


Siguiente Anterior Contenido