Conectar Perl con MySQL

Perl fue durante muchos años el lenguaje dominante para la programación web del lado del servidor y el procesamiento de datos. Su módulo DBI (Database Interface) junto con el driver DBD::mysql proporcionan una interfaz potente y flexible para trabajar con MySQL. En este artículo aprenderás a establecer una conexión, configurar el manejo de errores y aplicar las mejores prácticas para gestionar conexiones en tus scripts Perl.

Requisitos previos

Necesitas Perl 5.10 o superior instalado en tu sistema. Puedes verificar tu versión ejecutando perl -v en la terminal. También necesitas un servidor MySQL en ejecución y los módulos DBI y DBD::mysql instalados.

Instalación

Instala los módulos necesarios usando cpanm (recomendado) o cpan:

# Usando cpanm (recomendado)
# cpanm DBI DBD::mysql
 
# Usando cpan
# cpan install DBI DBD::mysql

El módulo DBI es la interfaz genérica de base de datos para Perl, y DBD::mysql es el driver específico para MySQL. DBI proporciona una API consistente que funciona con diferentes bases de datos, mientras que DBD::mysql maneja los detalles de comunicación con el servidor MySQL.

Código completo

Este ejemplo establece una conexión con MySQL, ejecuta una consulta de prueba y cierra la conexión:

#!/usr/bin/perl
use strict;
use warnings;
use DBI;
 
my $dsn = "DBI:mysql:database=tienda;host=localhost;port=3306";
my $usuario = "root";
my $clave = "tu_contraseña";
 
my $dbh = DBI->connect($dsn, $usuario, $clave, {
    RaiseError => 1,
    AutoCommit => 1,
    mysql_enable_utf8mb4 => 1,
    PrintError => 0
}) or die "Error de conexión: $DBI::errstr\n";
 
my $sth = $dbh->prepare("SELECT 1 + 1 AS resultado");
$sth->execute();
my $fila = $sth->fetchrow_hashref();
print "Conexión exitosa. Resultado: $fila->{resultado}\n";
 
$sth->finish();
$dbh->disconnect();

Salida esperada:

Conexión exitosa. Resultado: 2

Explicación paso a paso

La función DBI->connect() acepta cuatro argumentos: el DSN (Data Source Name), el usuario, la contraseña y un hash de opciones. El DSN especifica el driver a usar (mysql), la base de datos y el host. Las opciones controlan el comportamiento de la conexión.

Las opciones más importantes son:

my %opciones = (
    RaiseError          => 1,    # Lanzar excepción en errores (recomendado)
    AutoCommit          => 1,    # Confirmar automáticamente cada sentencia
    PrintError          => 0,    # No imprimir errores a STDERR
    mysql_enable_utf8mb4 => 1,   # Soporte UTF-8 completo
    mysql_auto_reconnect => 1,   # Reconectar automáticamente si se pierde la conexión
    mysql_connect_timeout => 10, # Timeout de conexión en segundos
);
 
my $dbh = DBI->connect($dsn, $usuario, $clave, \%opciones);
 
print "Conectado a MySQL. Versión del servidor: ",
      $dbh->{mysql_serverinfo}, "\n";
print "ID de conexión: ", $dbh->{mysql_thread_id}, "\n";

Salida esperada:

Conectado a MySQL. Versión del servidor: 8.0.35
ID de conexión: 42

La opción RaiseError es fundamental porque hace que DBI lance una excepción (die) cuando ocurre un error, en lugar de simplemente devolver undef. Esto evita que tu programa continúe ejecutándose con datos corruptos o conexiones fallidas.

Conexión usando archivo de configuración

En un entorno de producción, es recomendable separar las credenciales del código:

#!/usr/bin/perl
use strict;
use warnings;
use DBI;
use Config::Tiny;
 
# archivo: config.ini
# [database]
# host = localhost
# name = tienda
# user = root
# password = tu_contraseña
 
my $config = Config::Tiny->read('config.ini');
my $db = $config->{database};
 
my $dsn = "DBI:mysql:database=$db->{name};host=$db->{host}";
my $dbh = DBI->connect($dsn, $db->{user}, $db->{password}, {
    RaiseError => 1,
    AutoCommit => 1,
    mysql_enable_utf8mb4 => 1
});
 
print "Conectado a la base de datos: $db->{name}\n";

Obtener información de la conexión

# Información del servidor
print "Versión del servidor: ", $dbh->{mysql_serverinfo}, "\n";
print "Versión del protocolo: ", $dbh->{mysql_protoinfo}, "\n";
print "Host: ", $dbh->{mysql_hostinfo}, "\n";
print "Estadísticas: ", $dbh->{mysql_stat}, "\n";
 
# Listar bases de datos disponibles
my @bases = DBI->data_sources("mysql", { host => "localhost", user => "root", password => "tu_contraseña" });
print "Bases de datos disponibles:\n";
foreach my $base (@bases) {
    print "  $base\n";
}

Caso práctico

Veamos cómo crear un módulo de conexión reutilizable para una aplicación Perl:

# archivo: TiendaDB.pm
package TiendaDB;
use strict;
use warnings;
use DBI;
 
my $instancia;
 
sub new {
    my ($class, %args) = @_;
 
    return $instancia if $instancia;
 
    my $dsn = sprintf(
        "DBI:mysql:database=%s;host=%s;port=%s",
        $args{database} || 'tienda',
        $args{host}     || 'localhost',
        $args{port}     || 3306
    );
 
    my $dbh = DBI->connect($dsn, $args{user}, $args{password}, {
        RaiseError          => 1,
        AutoCommit          => 1,
        mysql_enable_utf8mb4 => 1,
        PrintError          => 0
    });
 
    $instancia = bless { dbh => $dbh }, $class;
    return $instancia;
}
 
sub dbh { return $_[0]->{dbh} }
 
sub desconectar {
    my ($self) = @_;
    $self->{dbh}->disconnect() if $self->{dbh};
    $instancia = undef;
}
 
1;
 
# archivo: app.pl
use strict;
use warnings;
use TiendaDB;
 
my $db = TiendaDB->new(
    host     => 'localhost',
    database => 'tienda',
    user     => 'root',
    password => 'tu_contraseña'
);
 
my $sth = $db->dbh->prepare("SELECT COUNT(*) AS total FROM productos");
$sth->execute();
my $resultado = $sth->fetchrow_hashref();
print "Total de productos: $resultado->{total}\n";
 
$db->desconectar();

Manejo de errores

Los errores de conexión se pueden manejar con eval o verificando el valor de retorno:

#!/usr/bin/perl
use strict;
use warnings;
use DBI;
 
sub conectar_con_manejo {
    my $dbh;
 
    eval {
        $dbh = DBI->connect(
            "DBI:mysql:database=tienda;host=localhost",
            "root", "contraseña_incorrecta",
            { RaiseError => 1, PrintError => 0 }
        );
    };
 
    if ($@) {
        my $error = $@;
        if ($error =~ /Access denied/) {
            print "Credenciales incorrectas. Verifica usuario y contraseña.\n";
        } elsif ($error =~ /Unknown database/) {
            print "La base de datos especificada no existe.\n";
        } elsif ($error =~ /Can't connect/) {
            print "No se pudo conectar al servidor MySQL.\n";
        } else {
            print "Error de conexión: $error\n";
        }
        return undef;
    }
 
    return $dbh;
}
 
my $dbh = conectar_con_manejo();
if ($dbh) {
    print "Conexión exitosa\n";
    $dbh->disconnect();
} else {
    print "No se pudo establecer la conexión\n";
}

Ahora que sabes cómo conectar Perl con MySQL, en el siguiente artículo aprenderás a crear tablas desde tus scripts Perl.

Escrito por Eduardo Lázaro