Perl 通过其强大的数据库接口模块(DBI)支持与各种数据库的交互,适用于MySQL、PostgreSQL、SQLite等。本文将介绍Perl中数据库连接的基本步骤和常见操作。


目录

  1. 数据库连接概述
  2. 安装与配置 DBI
  3. 连接数据库
  4. 执行 SQL 查询
  5. 处理查询结果
  6. 错误处理与事务
  7. 参考资料

1. 数据库连接概述

Perl 使用 DBI(Database Interface)模块作为标准数据库接口,配合特定数据库的驱动(如 DBD::mysql)实现连接。主要特点:

  • 跨数据库支持:只需更换驱动即可。
  • 灵活性:支持SQL查询、事务等。
  • 模块化:DBI为核心,驱动为扩展。

站内链接:了解模块使用,见 Perl 模块与CPAN


2. 安装与配置 DBI

安装 DBI

cpan DBI

安装数据库驱动

根据数据库类型安装对应驱动:

  • MySQL:cpan DBD::mysql
  • SQLite:cpan DBD::SQLite
  • PostgreSQL:cpan DBD::Pg

验证安装

use DBI;
print "DBI 版本:$DBI::VERSION\n";

3. 连接数据库

SQLite 示例

SQLite 是一个轻量级数据库,无需独立服务器。

use strict;
use warnings;
use DBI;

my $dbh = DBI->connect("dbi:SQLite:dbname=test.db", "", "", { RaiseError => 1 })
    or die $DBI::errstr;
print "连接到 SQLite 成功\n";
$dbh->disconnect;

MySQL 示例

use DBI;

my $dsn = "DBI:mysql:database=testdb;host=localhost;port=3306";
my $user = "username";
my $pass = "password";
my $dbh = DBI->connect($dsn, $user, $pass, { RaiseError => 1, AutoCommit => 1 })
    or die $DBI::errstr;
print "连接到 MySQL 成功\n";
$dbh->disconnect;
  • $dsn:数据源名称,格式为 DBI:驱动:参数
  • RaiseError:出错时抛出异常。

4. 执行 SQL 查询

创建表

my $dbh = DBI->connect("dbi:SQLite:dbname=test.db", "", "", { RaiseError => 1 });
$dbh->do("CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT, age INTEGER)");
print "表已创建\n";

插入数据

$dbh->do("INSERT INTO users (name, age) VALUES ('Alice', 25)");
print "数据已插入\n";

使用占位符(推荐)

防止SQL注入:

my $sth = $dbh->prepare("INSERT INTO users (name, age) VALUES (?, ?)");
$sth->execute("Bob", 30) or die $sth->errstr;
print "数据已插入\n";

5. 处理查询结果

简单查询

my $sth = $dbh->prepare("SELECT * FROM users");
$sth->execute();

while (my $row = $sth->fetchrow_hashref) {
    print "ID: $row->{id}, Name: $row->{name}, Age: $row->{age}\n";
}
$sth->finish;

获取所有行

my $rows = $dbh->selectall_arrayref("SELECT * FROM users", { Slice => {} });
for my $row (@$rows) {
    print "ID: $row->{id}, Name: $row->{name}, Age: $row->{age}\n";
}

单行查询

my $row = $dbh->selectrow_hashref("SELECT * FROM users WHERE name = 'Alice'");
print "找到:$row->{name}, $row->{age}\n";

6. 错误处理与事务

错误处理

使用 RaiseError 或手动检查:

eval {
    $dbh->do("INSERT INTO users (name) VALUES ('Charlie')");
};
if ($@) {
    print "错误: $@\n";
}

事务管理

eval {
    $dbh->{AutoCommit} = 0;  # 关闭自动提交
    $dbh->do("INSERT INTO users (name, age) VALUES ('David', 40)");
    $dbh->do("INSERT INTO users (name, age) VALUES ('Eve', 35)");
    $dbh->commit;  # 提交事务
};
if ($@) {
    print "事务失败: $@\n";
    $dbh->rollback;  # 回滚
}
$dbh->{AutoCommit} = 1;  # 恢复自动提交

7. 参考资料

站内链接

出站链接

其他资源

  • 《Programming the Perl DBI》 – 数据库编程书籍。
  • X社区:搜索 #PerlDBI 获取示例。

这篇指南详细介绍了Perl中数据库连接和操作的方法,以SQLite和MySQL为例。如果需要更深入的内容(比如连接池或特定数据库配置),请告诉我!