Perl Conexión a Base de Datos

En este capítulo, les presentaremos la conexión de Perl a la base de datos.

En Perl 5 podemos usar el módulo DBI para conectar a la base de datos.

El nombre completo en inglés de DBI es: Database Independent Interface, en chino se llama interfaz independiente de base de datos.

DBI es la interfaz estándar para la comunicación entre el lenguaje Perl y la base de datos. Define una serie de métodos, variables y constantes, y proporciona una capa de persistencia de base de datos independiente de la plataforma de base de datos específica.


Estructura DBI

DBI es independiente de la plataforma de base de datos específica; podemos aplicarlo en bases de datos como Oracle, MySQL o Informix, etc.

En el diagrama, DBI obtiene todos los datos SQL enviados por la API (Application Programming Interface: interfaz de programación de aplicaciones), los distribuye al controlador correspondiente para su ejecución y finalmente obtiene y devuelve los datos.

Convenciones de nombres de variables

A continuación se establecen los métodos de nomenclatura de variables más comunes:

$dsn    驱动程序对象的句柄
$dbh    一个数据库对象的句柄
$sth    一个语句或者一个查询对象的句柄
$h      通用的句柄 ($dbh, $sth, o  $drh),依赖于上下文
$rc     操作代码返回的布什值(true o  false)
$rv     操作代码返回的整数值
@ary    查询返回的一行值的数组(列表)
$rows   操作代码返回的行数值
$fh     文件句柄
undef   NULL 值表示未定义
\%attr  引用属性的哈希值并传到方法上

Conexión a la base de datos

A continuación, usaremos la base de datos MySQL como ejemplo para demostrar cómo Perl opera sobre la base de datos.

Aquí creamos la base de datos EJEMPLO en MySQL, la tabla de datos es Websites, la estructura de la tabla y los datos se muestran en la siguiente figura:

Descargar esta tabla de datos:/static.jyshare.com/download/websites_perl.sql

A continuación, usamos el siguiente código para conectar a la base de datos:

Ejemplo

#!/usr/bin/perl -w use strict; use DBI; my $host = "localhost"; # Dirección del host my $driver = "mysql"; # Tipo de interfaz, por defecto es localhost my $database = "EJEMPLO"; # Base de datos # Manejador del objeto controlador my $dsn = "DBI:$driver:database=$database:$host"; my $userid = "root"; # Nombre de usuario de la base de datos my $password = "123456"; # Contraseña de la base de datos # Conectar a la base de datos my $dbh = DBI->connect($dsn, $userid, $password ) or die $DBI::errstr; my $sth = $dbh->prepare("SELECT * FROM Websites"); # Preparar la sentencia SQL $sth->execute(); # Ejecutar la operación SQL # Esta parte comentada utiliza la operación de valores vinculados # $alexa = 20; # my $sth = $dbh->prepare("SELECT name, url # FROM Websites # WHERE alexa > ?"); # $sth->execute( $alexa ) or die $DBI::errstr; # Bucle para generar todos los datos while ( my @row = $sth->fetchrow_array() ) { print join('\t', @row)."\n"; } $sth->finish(); $dbh->disconnect();

Operación de inserción

Pasos de ejecución:

  • Use la API prepare() para preparar la sentencia SQL.
  • Use la API execute() para ejecutar la sentencia SQL.
  • Use la API finish() para liberar el manejador de la sentencia.
  • Finalmente, si todo va bien, se confirmarán las operaciones anteriores.
my $sth = $dbh->prepare("INSERT INTO Websites
                       (name, url, alexa, country )
                        values
                       ('Twitter', 'https://twitter.com/', 10, 'USA')");
$sth->execute() or die $DBI::errstr;
$sth->finish();
$dbh->commit or die $DBI::errstr;

La aplicación también puede vincular parámetros de salida y entrada. El siguiente ejemplo ejecuta una consulta de inserción reemplazando los marcadores de posición ? con variables:

my $name = "Twitter";
my $url = "https://twitter.com/";
my $alexa = 10;
my $country = "USA";
my $sth = $dbh->prepare("INSERT INTO Websites
                       (name, url, alexa, country )
                        values
                       (?,?,?,?)");
$sth->execute($name,$url,$alexa, $country) 
          or die $DBI::errstr;
$sth->finish();
$dbh->commit or die $DBI::errstr;

Operación de actualización

Pasos de ejecución:

  • Use la API prepare() para preparar la sentencia SQL.
  • Use la API execute() para ejecutar la sentencia SQL.
  • Use la API finish() para liberar el manejador de la sentencia.
  • Finalmente, si todo va bien, se confirmarán las operaciones anteriores.
my $sth = $dbh->prepare("UPDATE Websites
                        SET   alexa = alexa + 1 
                        WHERE country = 'CN'");
$sth->execute() or die $DBI::errstr;
print "更新的记录数 :" + $sth->rows;
$sth->finish();
$dbh->commit or die $DBI::errstr;

La aplicación también puede vincular parámetros de salida y entrada. El siguiente ejemplo ejecuta una consulta de actualización reemplazando los marcadores de posición ? con variables:

$name = 'Ejemplo';

my $sth = $dbh->prepare("UPDATE Websites
                        SET   alexa = alexa + 1 
                        WHERE name = ?");
$sth->execute('$name') or die $DBI::errstr;
print "更新的记录数 :" + $sth->rows;
$sth->finish();

Por supuesto, también podemos vincular los valores a establecer. Como se muestra a continuación, modifique todos los alexa con country = CN a 1000:

$country = 'CN';
$alexa = 1000:;
my $sth = $dbh->prepare("UPDATE Websites
                        SET   alexa = ?
                        WHERE country = ?");
$sth->execute( $alexa, '$country') or die $DBI::errstr;
print "更新的记录数 :" + $sth->rows;
$sth->finish();

Eliminar datos

Pasos de ejecución:

  • Use la API prepare() para preparar la sentencia SQL.
  • Use la API execute() para ejecutar la sentencia SQL.
  • Use la API finish() para liberar el manejador de la sentencia.
  • Finalmente, si todo va bien, se confirmarán las operaciones anteriores.

Los siguientes datos eliminan todos los registros de Websites donde alexa sea mayor que 1000:

$alexa = 1000;
my $sth = $dbh->prepare("DELETE FROM Websites
                        WHERE alexa = ?");
$sth->execute( $alexa ) or die $DBI::errstr;
print "删除的记录数 :" + $sth->rows;
$sth->finish();
$dbh->commit or die $DBI::errstr;

Usar la sentencia do

doLa sentencia puede ejecutar operaciones UPDATE, INSERT o DELETE. Usarla es más breve. Devuelve true si se ejecuta correctamente y false si falla. Ejemplo:

$dbh->do('DELETE FROM Websites WHERE alexa>1000');

Operación COMMIT

commit confirma la transacción y completa las operaciones de la base de datos:

$dbh->commit or die $dbh->errstr;

Operación ROLLBACK

Si se produce un error durante la ejecución de SQL, puede revertir los datos sin realizar ningún cambio:

$dbh->rollback or die $dbh->errstr;

Transacciones

Al igual que otros lenguajes, el módulo DBI de Perl también admite el procesamiento de transacciones en las operaciones de base de datos. Hay dos formas de implementarlo:

1. Iniciar una transacción al conectar a la base de datos

$dbh = DBI->connect($dsn, $userid, $password, {AutoCommit => 0}) or die $DBI::errstr;

El código anterior establece AutoCommit en false al conectar. Es decir, cuando realiza operaciones de actualización en la base de datos, no escribirá automáticamente esas actualizaciones directamente en la base de datos; el programa debe usar $dbh->commit para que los datos se escriban realmente en la base de datos, o $dbh->rollback para revertir la operación anterior.

2. Iniciar una transacción mediante la sentencia $dbh->begin_work()

De esta manera no es necesario establecer AutoCommit = 0 al conectar a la base de datos.

Se pueden realizar múltiples operaciones de transacción con una sola conexión de base de datos, sin necesidad de conectarse a la base de datos al inicio de cada transacción.

$rc  = $dbh->begin_work  or die $dbh->errstr;

#####################
##这里执行一些 SQL 操作
#####################

$dbh->commit;    # 成功后操作
-----------------------------
$dbh->rollback;  # 失败后回滚

Desconectar la conexión a la base de datos

Si necesitamos desconectar la conexión a la base de datos, podemos usar la API disconnect:

$rc = $dbh->disconnect  or warn $dbh->errstr;
Otras extensiones