Actualizado el 27 de Agosto del 2018 (Publicado el 18 de Marzo del 2018)
849 visualizaciones desde el 18 de Marzo del 2018
74,4 KB
5 paginas
Creado hace 21a (14/10/2003)
Acceso a bases de datos en Perl
Mart´ın Ferrari
16 de Julio de 2003
Una introducci´on a la interfaz de bases de datos DBI de Perl.
Resumen
1. Qu´e es una Base de Datos
El concepto de base de datos es simplemente una forma de guardar in-
formaci´on y de obtener datos.
2. Qu´e es DBI
DBI significa: DataBase Interface. Es decir, interfaz de base de datos.
Las principales caracter´ısticas de DBI son: que provee una interfaz ho-
mog´enea de acceso a bases de datos, y que es modular -cualquiera puede
agregar soporte para una nueva base de datos f´acilmente-.
Gracias a esto no necesitamos hacer grandes cambios en un programa
si decidimos, por ejemplo, migrar una aplicaci´on que acced´ıa una base de
datos MySQL a PostgreSQL. O si queremos un cambio m´as radical podemos
decidir dejar de depender de un motor de base de datos y utilizar la interfaz
de acceso a archivos CSV (Comma Separated Values o valores separados por
comas) que con los mismos comandos SQL de MySQL o PostgreSQL nos
permite manipular los datos guardados en un archivo de texto!
3. Estructura de DBI
DBI nos prove´e una interfaz de objetos; no debemos preocuparnos mucho
por ello, ya que dentro de perl el acceso a objetos es sencillo, e intuitivo para
cualquiera que haya usado objetos de otro lenguaje.
Es importante tener en cuenta un par de datos:
1
Los constructores s´olo se diferencian de los m´etodos comunes en que
devuelven una nueva instancia del objeto. Su nombre no est´a prefijado
por el lenguaje, por ejemplo en DBI el constructor se llama connect.
La invocaci´on de m´etodos y constructores se hace con el operador flecha
(->), a la izquierda va la referencia al objeto o clase y a la derecha el
m´etodo o contructor.
Por ejemplo: $dbh = DBI->connect(...), $dbh->disconnect()
El objeto que maneja la clase DBI es un manejador de conecci´on a la base
de datos por lo tanto es l´ogico que el constructor sea connect.
Para m´as referencia, en sistemas UNIX se puede consultar las p´aginas
man de: perlobj(1), perltoot(1) y perltooc(1). 1
DBI en s´ı no puede conectarse a ninguna base de datos, s´olo prove´e la
interfaz unificada. Para el acceso real a base de datos, carga en el momento
de conexi´on el controlador espec´ıfico solicitado por el programador. Los con-
troladores son llamados DBD (Data Base Driver o controlador de base de
datos) y todos se llaman DBD::xxxx.
En la siguiente lista se pueden ver algunos controladores DBD, no es una
lista extensiva de controladores disponibles.
DBD::CSV
DBD::Excel
DBD::LDAP
DBD::mysql
DBD::ODBC
DBD::Pg
DBD::RAM
Acceso a archivos CSV con consultas SQL
Acceso a archivos de Excel con consultas SQL
Acceso a directorios LDAP con consultas SQL
Acceso a bases MySQL
Acceso a bases de datos usando ODBC
Acceso a bases PostgreSQL
Acceso generalizado a estructuras en memoria o archivos
utilizando consultas SQL
DBD::SQLite Acceso a bases SQLite, un motor relacional auto-
contenido en una biblioteca
DBD::Sybase Acceso a bases Sybase y MS-SQL
4. Usando DBI
Aunque DBI no exige el uso de SQL como lenguaje de consultas, est´a muy
influenciado por ´el y todos los manejadores que conocemos usan SQL (emul´ando-
1En entornos no-UNIX, por lo general esta documentaci´on se encuentra en otro formato;
en ´ultima instancia siempre se puede consultar en http://www.perldoc.com/
2
lo si hace falta, como en los casos de DBD::Excel, DBD::LDAP o DBD::CSV, o
simplemente pasando los comandos al motor respectivo).
4.1. Conexi´on a la base de datos
Connect espera al menos un par´ametro que es la especificaci´on de cone-
xi´on (DSN) que es una cadena formada por "dbi:" segido del nombre del
manejador deseado y luego un string dependiente del manejador, que espe-
cifica otros datos como nombre de servidor, nombre de base de datos, etc.
Opcionalmente, luego del DSN, van el nombre de usuario y clave para acceder
a los datos.
Ejemplo:
$dbh = DBI->connect("dbi:mysql:database=testdb;host=localhost",
$user, $password);
$dbh = DBI->connect("dbi:SQLite:dbname=/var/lib/base", "", "");
$dbh = DBI->connect("dbi:CSV:f_dir=/var/lib/basecsv/", "", "");
4.2. Lectura de datos
Una vez que obtuvimos una conexi´on a la base, podemos empezar a re-
cuperar datos.
Depende de c´omo querramos recuperar los datos, cuantas veces tenga-
mos que repetir la operaci´on y otras variables, podremos usar una de varias
maneras de trabajar.
Veremos una manera simple de recuperar los datos de un select de a
una fila. Primero componemos el comando, lo que nos da un manejador de
comando (statement handler) y con ese manejador, ejecutamos el comando
y luego recuperamos los datos.
$sth = $dbh->prepare("
SELECT nombre, apellido, cumple
FROM amigos
");
$sth->execute;
while(@datos = $sth->fetchrow_array()) {
print "$datos[0] $datos[1] cumple a~nos el $datos[2]\n";
}
3
4.3. Modificaci´on de datos y otros comandos
Cuando no necesitamos recuperar datos, la secuencia es m´as sencilla,
invocamos un s´olo m´etodo que hace todo el trabajo: do.
$filas_cambiadas = $dbh->do("
UPDATE amigos
SET sexo = ’m’
WHERE nombre = ’Juan’
");
$dbh->do("DROP TABLE amigos");
4.4. M´as poder
DBI es mucho m´as que todo esto. Algunas caracter´ısticas importantes:
Sistema para capturar y reportar errores configurable seg´un las necesi-
dades del programador.
Manejo de transacciones, commits y rollback s.
Diversas maneras de recuperar datos de SELECT que se adaptan a
distintas situaciones, y consumos de memoria.
Manejo de m´ultiples conexiones a bases distintas o a la misma base,
utilizando instancias independientes del objeto.
5. Ejemplo
Un ejemplo de uso de DBI: extrae los datos de una tabla de MySQL y
los ingresa en una “tabla” CSV (usando el manejador de CSV, cada tabla es
un archivo).
#!/usr/bin/perl
use warnings;
use strict;
use DBI;
my($host, $base, $usuario, $clave, $tabla) =
qw/localhost test apache telecom9 tabla1/;
4
my($dircsv, $archcsv) = ("./", "datos_de_mysql");
my($dbh1, $sth1, $dbh2, $sth2, @fila, @columnas);
$dbh1 = DBI->connect("dbi:mysql:host=$host;database=$base", $usuario, $clave,
{ RaiseError => 1, AutoCommit => 1 });
# DESCRIBE devuelve Field, Type, Null, Key, Default, Extra
$sth1 = $dbh1->prepare("DESCRIBE $tabla");
$sth1->execute();
while(@fila = $sth1->fetchrow_array()) {
push(@columnas, $fila[0]);
}
$dbh2 = DBI->connect("dbi:CSV:f_dir=$dircsv", "", "",
{ RaiseError => 1, AutoCommit => 1 });
$dbh2->do("CREATE TABLE $archcsv (" . join(", ", map("$columnas[$_] varchar(255)", 0..$#columnas)) . ")");
$sth2 = $dbh2->prepare("INSERT INTO $archcsv (" . join(’, ’, @columnas) .
") VALUES (" . join(", ", map("?", @columnas)) . ")");
$sth1 = $dbh1->prepare("SELECT * FROM $tabla");
$sth1->execute();
while(@fila = $sth1->fetchrow_array()) {
$sth2->execute(@fila);
}
5
Comentarios de: Acceso a bases de datos en Perl (0)
No hay comentarios