Effective-Perl-Notes

可遵循 perlstyle 文档的风格.

本书相关的网站 ( http://effectiveperl-programming.com/ )

Perl 高尔夫, 是一种不定时举行的 Perl 程序设计游戏, 以程序编码最短者获胜, 就像高尔夫球中最少杆者获胜一样, 具体参考 http://perlgolf.sourceforget.net/

第12章 数据库

预备 SQL 语句以复用并节省时间

先缓存对查询语句的解析和预处理结果, 以便后续执行时复用.

prepare 方法返回查询语句句柄对象 $sth, 将相关预备信息存储在其内部:

1
2
3
4
use DBI;
my $dbh = DBI->connect(...)
or die 'unable to connect to database';
my $sth = $dbh->prepare('SELECT * FROM table WHERE id = ?');

碰到使用占位符构造的查询语句, 数据库会自动缓存.

在查询语句句柄对象上调用 execute 方法来查询:

1
2
3
4
foreach my $id (@ids) {
my $array = $dbh->execute($id);
...
}

使用 prepare_cached 可以自动缓存查询句柄.

利用 SQL 占位符将参数值自动引起

始终在 SQL 语句检索值的位置使用占位符. 可以改善性能以及避免 SQL 注入.

注意

  • 不要在查询语句中直接内插变量
  • 用占位符表示动态数据的值

要是单条语句需要多次运行, 可以将它先做预备, 然后在执行时提供具体数据:

1
2
3
4
5
6
7
my $sth = $dbh->prepare(
'select v1, v2 from my_table where id = ?');

foreach my $id (@ids) {
$sth->execute($id);
...
}

创建动态的 SQL 元素.

占位符只适用于代表插入查询语句中的数据值 (也就是 scalar value), 无法表示查询语句的某个组成部分. (如数据库, 表的名字).

若是在运行时才能确定所查询的表, 可以利用 DBI 的 quote_identifier 方法将表名变量的值安全转义后构造查询语句:

1
2
3
4
my $table = get_table_name();
my $sth = $dbh->prepare(
sprintf('select * from %s',
$dbh->quote_identifier($table));

通过绑定返回列快速访问数据

直接将固定变量的引用绑定到查询句柄上, 通过类似内存指针的方式定位数据, 避免无效的赋值操作.

使用 bind_columnsbind_col 来选择需要的列.

如, 将以下代码:

1
2
3
4
5
6
7
8
9
10
11
use DBI;

my $dbh = DBI->connect(...);

my $sth =
$dbh->prepare('select one, two, three from my_table');
$sth->execute;

while (my ($one, $two, $three) = $sth->fetchrow_array) {
...
}

改为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
use DBI;

my $dbh = DBI->connect(...);

my $sth =
$dbh->prepare('select one, two, three from my_table');
$sth->execute;

my ($one, $two, $three);

$sth->bind_columns(\$one, \$two, \$three);

while ($sth->fetchrow_arrayref) {
...
}

复用数据库连接

连接数据库是一项比较耗时的操作, 应避免创建过多的连接, 尽可能使用缓存的连接.

如果一段时间没有交互, 数据库服务器会切断连接, 可以用 DBI 的 ping 方法检查当前连接是否有效.

1
$dbh->ping;

考虑共享数据库连接, 如:

  • 一个对象一个连接
  • 一个类一个连接
  • 在进程间共享连接

在进程间共享连接可使用 DBD::Gofer 模块架设代理服务器, 由它管理 DBI 连接. 它会在独立进程中维护连接缓存.


Effective-Perl-Notes
http://example.com/2023/01/08/Effective-Perl-Notes/
作者
Jie
发布于
2023年1月8日
许可协议