Perlデータベース接続


この章では、Perl データベース接続について紹介します。

Perl 5 では、DBI モジュールを使用してデータベースに接続できます。

DBI の正式な英語名: Database Independent Interface、中国語では Database Independent Interface と呼ばれます。

DBI は、Perl 言語でデータベースと通信するための標準インターフェイスであり、一連のメソッド、変数、定数を定義し、特定のデータベース プラットフォームに依存しないデータベース永続層を提供します。


DBI 構造

DBI は、Oracle、MySQL、Informix などのデータベース プラットフォームとは何の関係もありません。図中の

DBIは、API(Application Programming Interface)から送られてくるSQLデータを全て取得し、対応するドライバーに振り分けて実行し、最後にデータを取得して返します。

変数名の規則

以下は、より一般的に使用される変数名の命名方法を設定します:

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

データベース接続

次に、MySQL データベースを例として取り上げ、Perl がデータベースを操作する方法を示します。

ここでは MySQL データベースに php データベースを作成します。データ テーブルは Websites です。テーブルの構造とデータは次の図に示されています。

データ テーブルをダウンロードします: http://static.php。 cn/download/websites_perl.sql

次に、次のコードを使用してデータベースに接続します:

#!/usr/bin/perl -w

use strict;
use DBI;

my $host = "localhost";         # 主机地址
my $driver = "mysql";           # 接口类型 默认为 localhost
my $database = "php";        # 数据库
# 驱动程序对象的句柄
my $dsn = "DBI:$driver:database=$database:$host";  
my $userid = "root";            # 数据库用户名
my $password = "123456";        # 数据库密码

# 连接数据库
my $dbh = DBI->connect($dsn, $userid, $password ) or die $DBI::errstr;
my $sth = $dbh->prepare("SELECT * FROM Websites");   # 预处理 SQL  语句
$sth->execute();    # 执行 SQL 操作

# 注释这部分使用的是绑定值操作
# $alexa = 20;
# my $sth = $dbh->prepare("SELECT name, url
#                        FROM Websites
#                        WHERE alexa > ?");
# $sth->execute( $alexa ) or die $DBI::errstr;

# 循环输出所有数据
while ( my @row = $sth->fetchrow_array() )
{
       print join('\t', @row)."\n";
}

$sth->finish();
$dbh->disconnect();

挿入操作

実行手順:

  • prepare() API を使用して SQL ステートメントを準備します。

  • SQL ステートメントを実行するには、execute() API を使用します。

  • finish() APIを使用してステートメントハンドルを解放します。

  • 最後に、すべてがうまくいけば、上記の実行操作が送信されます。

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

アプリケーションは、出力パラメータと入力パラメータをバインドすることもできます。次の例では、? プレースホルダーの位置を変数に置き換えて挿入クエリを実行します。 prepare() API は SQL ステートメントを準備します。


SQL ステートメントを実行するには、execute() API を使用します。

  • finish() APIを使用してステートメントハンドルを解放します。

  • 最後に、すべてがうまくいけば、上記の実行操作が送信されます。

  • my $name = "Twitter";
    my $url = "https://twitter.com/";
    my $alexa = 10;
    my $conutry = "USA";
    my $sth = $dbh->prepare("INSERT INTO Websites
                           (name, url, alexa, conutry )
                            values
                           (?,?,?,?)");
    $sth->execute($name,$url,$alexa, $conutry) 
              or die $DBI::errstr;
    $sth->finish();
    $dbh->commit or die $DBI::errstr;
  • 次の例では、? プレースホルダーの位置を変数に置き換えて更新クエリを実行します。もちろん、次のように値をバインドすることもできます。これは、CN が国である Alexa が 1000 に変更されたことを示しています:

    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;

  • データを削除
  • 実行手順:

prepare() API を使用して SQL ステートメントを準備します。


SQL ステートメントを実行するには、execute() API を使用します。

finish() APIを使用してステートメントハンドルを解放します。
  • 最後に、すべてがうまくいけば、上記の実行操作が送信されます。
  • 次のデータは、Alexa が 1000 を超えるウェブサイトのすべてのデータを削除します:
  • $name = 'php中文网';
    
    my $sth = $dbh->prepare("UPDATE Websites
                            SET   alexa = alexa + 1 
                            WHERE name = ?");
    $sth->execute('$name') or die $DBI::errstr;
    print "更新的记录数 :" + $sth->rows;
    $sth->finish();

    do ステートメントを使用します

    do do

    ステートメントは、実行が成功した場合は true を返し、失敗した場合は false を返します。例は次のとおりです:
    $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();

    COMMIT操作

    コミットはトランザクションを送信してデータベース操作を完了します:
    $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;

    ROLLBACK操作

    SQLの実行中にエラーが発生した場合、変更を加えずにデータをロールバックできます。 :
    $dbh->do('DELETE FROM Websites WHERE alexa>1000');

    トランザクション

    他の言語と同様に、perl DBI はデータベース上で動作します。更新操作を実行するとき、それらの更新は自動的にデータベースに直接書き込まれません。代わりに、プログラムは $dbh->commit を使用します。実際にデータをデータベースに書き込むか、$dbh->rollback で今の操作をロールバックします。

    2. $dbh->begin_work() ステートメントを通じてトランザクションを開始します

    このメソッドでは、データベースに接続するときに AutoCommit = 0 を設定する必要はありません。

    各トランザクションの開始時にデータベースに接続することなく、1 つのデータベース接続で複数のトランザクション操作を実行できます。

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

    データベース接続を切断します


    データベース接続を切断する必要がある場合は、切断 API を使用できます:

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