【初心者向け】PerlでのDBI接続について【Perl】

# 前書き
　PerlでDBIモジュールを利用してデータベース接続を行うときの手順をメモ。ご指摘あればよろしくお願いします。

```
ちなみに、変数の前に my とついているのは、その変数がレキシカル変数であることを表しています。
そのスコープ内での重複を許さない、一意の変数であることの宣言です。

要するにとりあえず my つけとけばエラー減るよ〜〜ってことです。
また、モジュールを利用するときはモジュール名の前に use をつけます。

今回のPerlでのDBI接続そのものには関係なので気にしないでください。
```
【my - レキシカル変数の宣言　　-Perlゼミ(サンプルコードPerl入門)】
http://d.hatena.ne.jp/perlcodesample/20080307/1204910413

# PerlでのDBI接続の概要
```perl:db_test.pl

#!/usr/bin/perl
use strict;
use warnings;
use DBI;

# データベース接続準備
my $dsn = "dbi:mysql:database=test;host=Localhost;port=3306";
my $user = "user名";
my $pass ="password";

# データベースハンドル
my $dbh = DBI->connect( $dsn, $user, $pass, {
    AutoCommit => 1,
    PrintError => 0,
    RaiseError => 1,
    ShowErrorStatement => 1,
    AutoInactiveDestroy => 1
})|| die $DBI::errstr;

```
こんな感じです。
詳しく説明していきます。

# コードの説明
##魔法の言葉たち

```perl

#!/usr/bin/perl
```
魔法の呪文その１。
Perlのパス。とりあえず先頭行に書いておく魔法の呪文です。
Perlを実行させるアプリケーションが、サーバ内でインストールされている場所を示しています。
よくあるファイルの拡張子的な存在です。


```perl

use strict;
```
魔法の呪文その2。
Perlは自由奔放な言語なので、微妙に間違っていても内部できっちり処理されてしまいます。
これ書いておくと、エラーになりそうな箇所も教えてくれるので絶対書き漏らさないようにしましょう。


```perl

use warnings;
```
魔法の呪文その3。
これ書いとかないとdebugが出てこなくなったりするので何をするときでも絶対記述しましょう。


```perl

use DBI;
```
今回の主役です。
use DBI;
と記述することで、DBIモジュールを利用することができます。

また、

>```perl
use モジュール名 qw/ モジュールが提供する関数 /
```

と記述すると、そのモジュールが提供する関数を利用できます。
詳しくはモジュールごとのドキュメントをお読みください。


##データベースハンドル
```perl:db_test.pl

# データベースの接続準備
my $dsn = "dbi:mysql:database=test;host=Localhost;port=3306";
my $user = "user名";
my $pass ="password";

# データベースハンドル
my $dbh = DBI->connect( $dsn, $user, $pass, {

　　　　ここにはオプションを設定します。

})|| die $DBI::errstr;
```

DBIを用いてデータベースに接続するときは、
「データベースに接続した状態」という抽象的な状態を、インスタンスとして取得して利用します。
このインスタンスのことを**データベースハンドル**と言います。
データベースハンドルはデータベースハンドルメソッドであるconnectメソッドを利用することで取得することができます。

###connectメソッド 

データベースハンドルは、

```perl

# データベースハンドル
my $dbh = DBI->connect( 接続するための設定はここでします );
```
で、取得することができます。
データベースハンドルを取得する際には、接続したいデータベースの情報が必要になります。


```perl

# データベースの接続準備
my $dsn = "dbi:mysql:database=test;host=Localhost;port=3306";
my $user = "user名";
my $pass ="password";
```
詳しく説明していきます。

```perl

my $dsn = "dbi:mysql:database=test;host=Localhost;port=3306";
```
上記コードでは、
変数＄dsnに

 - 接続するデータベースのドライバ
 - 接続先のデータベースの名前
 - ホスト名
 - ポート番号
 
が代入されています。


```perl

my $user = "user名";
my $pass ="password";
```
接続先のデータベースのユーザー名と、パスワードを設定します。


####接続するデータベースのドライバ
　使用するデータベースに対応するドライバを選択します。今回の例ではmysqlのドライバを使用します。
ドライバを使用する際も、そのドライバモジュールをインストールする必要があります。


 >【INSTALL - DBD::mysqlのインストールと構成設定の方法】
http://perldoc.jp/docs/modules/DBD-mysql-2.1026/DBD/mysql/INSTALL.pod


####データベースの名前
　接続先のデータベースの名前をここで記述します。もしまだデータベースが存在していない場合は、先にデータベースとテーブルを作成してください。今回の例では、データベース「test」に接続させます。

####ホスト名
　データベースが稼働しているサーバーのサーバー名を記述します。今回は自身のPC内のデータベースを利用するので、Localhost と設定しています。

####ポート番号
　MySQLのデフォルトのポート番号は3306なので今回は3306で指定します。。

####データベースのユーザー名
　データベースの各自のユーザー名です。（rootならroot）

####データベースのパスワード
　データベースの各自のパスワードです。（設定してなかったら記述なし）

です。

これに追加して、様々なオプションを記述します。

>
>　ドライバ・データベース名・ホスト名・ポート番号を$dsnと名付けた変数に代入している理由は、DSN（データソースネーム）を表している変数だからです。
【e-Wrords -IT用語辞典】
http://e-words.jp/w/DSN-1.html

##オプション
```perl

my $dbh = DBI->connect( $dsn, $user, $pass, { 

　　　　ここにオプション書きます　

})|| die $DBI::errstr;
```

基本的なオプションが下記になります。

```perl

AutoCommit => 1,
```
　トランザクションについて制御する部分です。AutoCommit => 1 でセットされている場合、データベースに対して行なった変更は自動的に反映される事になります。デフォルトでは 1 がセットされています。
もし各自でトランザクションを制御したい場合は、AutoCommit => 0 をセットして、任意のタイミングでcommit/rollbackを行います。

>```perl

>#commit
>my $rc = $dbh->commit;
```

任意のタイミングでコミットを行います。
>```perl

>#rollback
my $rc = $dbh->rollback;
>```

任意のタイミングでロールバックします。



```perl

PrintError => 0,
```
　クエリ実行時などにエラーが発生すると、warnを使って出力するオプションです。DBIのデフォルトでは PrintError => 1 になっていますが、この後のRaiseErrorを使うため、重複表示を防ぐためにここでは無効に設定します。

```perl

RaiseError => 1,
```
　クエリ実行時などにエラーが発生した際に、例外を投げます。DBIのデフォルトでは RaiseError => 0に設定されていて、エラーがないかどうかを自身で処理する必要があります。

```perl

ShowErrorStatement => 1,
```
　RaiseErrorやPrintErrorのエラーメッセージに、エラーの起きたクエリを追加表示してくれるオプションです。

```perl

AutoInactiveDestroy => 1
```
　forkした際に安全に$dbhを破棄してくれるオプションです。
詳しくは下記を参照してください。

>
【DBIとforkの関係　-heboi blog】
http://nihen.hatenablog.com/entry/2011/11/17/102557



```perl

|| die $DBI::errstr;
```
もしエラーが出たらkillするっていう文です。



# 引用

【第30回　データベースプログラミング入門―汎用インタフェースDBIと，O/RマッパTengの使い方】
http://gihyo.jp/dev/serial/01/perl-hackers-hub/003002?page=1

【DBI/DBDの使い方】
http://ash.jp/db/dbi_dbd.htm

【DBI - Perl 用データベース独立インターフェース　-perldoc.jp】
http://perldoc.jp/docs/modules/DBI-1.612/DBI.pod

【DBI->connect 時に使う鉄板オプションを教えて！ -blog.nomadscafe.jp】
http://blog.nomadscafe.jp/2012/11/dbi-connect.html