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;
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 を使用できます: