きまブログ

2022-12から再開しました。

FuelPHPでデータベース接続テスト - PostgreSQL編

2014-11-06 追記

ご注意
ここで紹介する方法だと、次のステップ

$ oil generate model ...

で生成したデータベース構築のマイグレーションファイルで、
うまくPostgreSQLへテーブル生成ができないことがわかり、
急遽、MySQLへ路線変更しますw

FuelPHPでデータベース接続テスト - MySQL編 - きまブログ

とりあえず、FuelPHP経由でデータベースへ接続して、
データを抽出できることを確認したいので、
適当なデータベースを作っておきます。


参考)
【備忘録】PostgreSQL & phpPgAdmin のインストール (ubuntu14) - きまブログ

データベース(PostgreSQL)側の準備

データベースロールの作成

ブラウザからphpPgAdminへ、postgres ユーザーでログインし、
ロール (PostreSQLのユーザーみたいなの) を作成します。


「データベースの作成」だけ、できるようにします。(適当です。)

データベースの作成

一旦、postgresをログアウトし、上で、作成したロールでログインし直し、
データベースを作成します。
 データベース名:fuel_dev
 テンプレート:template1 ← ナゾ。
で作成しておき、テーブルを追加して、適当にデータを入れておきます。


自分で作成したロールでデータベースを作成したのに、
所有者がpostgresになるナゾ。

FuelPHPの準備 - PostgreSQL

環境について

データベースの設定でちょっと関係するので、FuelPHPの動作環境について。
FuelPHPには、
- development(開発)
- test(評価)
- stage(ステージング)
- production(プロダクション)
という、4つの動作環境が用意されています。


それぞれ挙動が違うんだと思いますが、まだ未調査です。
ざっと見た感じエラー処理のトコロで分岐があるみたいだけど。。


stage(ステージング)というのは、一般に顧客の評価環境で、
基本的にproduction(実運用環境)と同じ環境にして動作させるモードです。

db.php の設定 - PostgreSQL

db.phpは、FuelPHPがデータベースへ接続する時に使う設定情報で、
基本的な情報は、/fuel/core/config/db.php が反映され、
上書きしたい情報を、/fuel/app/config/development/db.php へ書き込みます。
※ 基本的にdevelopment 環境で開発するので、とりあえずココに書き込んでおきます。

fuel/app/config/development$ cat db.php
<?php
/**
 * The development database settings. These get merged with the global settings.
 */

return array(
 'default' => array(
  'connection'  => array(
   'dsn'        => 'pgsql:host=localhost;dbname=fuel_dev',
   'username'   => 'user_name',
   'password'   => 'user_password',
  ),
  'charset'	=> NULL,
  'identifier' => "\"" /* for PostgreSQL */
  ),
);

ポイント1つ目:

 'charset'=> NULL,

もともと、utf8で設定されているのを、ここでNULLへ上書き。。
データベースはUTF-8で設定してあるのになぜ?


ポイント2つ目:

 'identifier' => "" /* for PostgreSQL */

これを書いておかないと、生成するテーブル名とかを`(バッククオート)で囲みます。
これは、MySQLでテーブル名に予約名が設定されていた場合にエスケープするためのようです。


つまり、ここでは、PostgreSQLを使うため、変にSQL文中にバッククオートが入るとエラーになるので、
identifierを空にしておきます。
※ ここでは空(””)にしてありますが、ダブルクオーテーション(“\”")にしてもいいかも。。


っていうか、やっぱMySQLが基本か〜。。

実行結果 - PostgreSQL

いままでテストで作ってきたコントローラーのメソッドに、
こんな感じでデータベースのテーブル test_tableの全レコードを読み込むようにして、
結果の配列をvar_dump()で全部出力するようにしてみると。。

  public function action_dbtest()
  {
    $query = DB::select()->from('test_table')->execute();
    var_dump($query);
  }


うまく表示できました。。っていうのかなコレ。。
array['_result']にデータベースに書き込んだ内容が表示されているのでOKでは?
ここでは、identifierにダブルクオーテーションを設定してあります。

object(Fuel\Core\Database_Result_Cached)#23 (5) {
  ["_query":protected]=>
  string(26) "SELECT * FROM "test_table""
  ["_result":protected]=>
  array(2) {
    [0]=>
    array(2) {
      ["id"]=>
      int(1)
      ["name"]=>
      string(5) "test1"
    }
    [1]=>
    array(2) {
      ["id"]=>
      int(2)
      ["name"]=>
      string(5) "text2"
    }
  }
  ["_total_rows":protected]=>
  int(2)
  ["_current_row":protected]=>
  int(0)
  ["_as_object":protected]=>
  bool(false)
}


次回は、ついにoil generateコマンドでModelのコード自動生成?