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
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