「[:ja]データベース[:en]Database[:]」タグアーカイブ

FuelPHP 複数データベースへの migration


FuelPHP で複数データベースへ migration を行うやり方を説明します。 FuelPHP 1.7.2 を想定しています。

FuelPHP では php oil g model item name:string などのようにすると、 model と migration のためのコードが生成されます。 php oil g scaffold ... とやった場合にも migration のコードが生成されます。 ここで生成される migration コード に手を加えることで 複数データベースに対応させることができます。

変更前のコード

変更後のコード

db_config_key というのを付け加えました。 このパラメータでデータベースを指定できます。 具体的には config/db.php 内 のキーになります。 たとえば 'default' なんてのが入ります。 何も指定がなければ 'default' が採用されます。

このようにして複数データベースに対応させることができます。 migration の コードごとに データベースを書き換えればいいですからね。

Model の コードを活用した書き方

Model を利用してやってみましょう。

Model_ItemOrm を使っているという前提の話ですが、 データベースの指定に Model_Item::connection() を、 テーブルの指定に Model_Item::table() を、 主キーの指定に Model_Item::primary_key() を使っています。 このようにすると、 model の中に書いておけば migration のコードを変更しなくても済みます。 (ただし 既存テーブルについて model の テーブル名や $_connection を変更する場合には注意が必要になります。)


FuelPHP で使用可能なデータベース


FuelPHP でどのデータベースが使えるのか、コードを覗いてみました。

環境

  • FuelPHP 1.8 (GitHub)

使用可能なデータベース

FuelPHP では 次の DBMS を扱うことができます。 扱うことができるといってもドライバとして参照するというだけで、 完璧に使えるわけではありません。

  • Cubrid
  • FreeTDS
  • Microsoft SQL Server
  • Sybase
  • Firebird
  • IBM DB2
  • IBM Informix Dynamic Server
  • MySQL
  • Oracle Call Interface
  • ODBC v3 (IBM DB2, unixODBC and win32 ODBC)
  • PostgreSQL
  • SQLite 3, 2
  • SQL Azure
  • 4D

調べ方

まずはマニュアルを読みます。 Database Introduction のところに Can be mysql, mysqli or pdo と あります。 つまり、 mysql の専用ドライバか、PDOドライバが使えるんですね。

続いて PDO について PHP のドキュメント を確認します。 すると、上述の DBMS すべてについて PDO が使えることがわかります。 もちろん PDOドライバがマシンに入っていればの話ですし、PDOとDBMSのバージョンには気をつけないといけませんね。

本当に PDO で繋がるのか? と思ったら、 FuelPHP のコアファイルの中の接続部分を担っているコードを見ましょう。 mysql, mysqli, PDO の3通りの connection.php があり、 PDO であれば PDO ドライバを使って DB に接続するようになっていることがわかります。

sqlite を使う場合の注意点

sqlite を使う場合にはいくつか気をつけることがあります。 (FuelPHP version 1.7.2)

Primary Key に注意

Primary Key を他のデータベースと同じように設定しようとすると migration が動きません。 sqlite3 では、 Primary Key に名前をつけることができません。 例えば MySQL なら Primary Key id (id) となるところが、 sqlite3 だと Primary Key (id) というようになります。

直接SQLを作って実行するか、 FuelPHP の該当箇所を書き換えるかして凌ぐしかないです。 Primary Key を使わないという選択肢もありますが、おすすめはしません。

また通常は migration file を php oil を使って作成すると 自動で UNSIGNEDid が作成されて AUTO_INCREMENT が設定されますが、 sqlite ではこれが動きません。 sqlite では AUTO_INCREMENT ではなく AUTOINCREMENT になります。 いまのところ自動生成のスクリプトでは対応していませんので FuelPHP の core のコードを変更する必要があります。 そして自動生成される UNSIGNED は 削除しましょう。 sqlite では UNSIGNED BIT INT というのが使えますが、 使ったところで INTEGER と解釈されます。

charset を空にする

sqlite3 では charset の指定方法が他のデータベースとは異なります。 PRAGMA statement を使います。 (確か sqlite3 では標準文字コードが utf-8 だったと思います。)

データベースの設定(config/db.php)で文字コードの指定をしないと php oil migrate を実行する際に CREATE TABLE の構文で 末尾に DEFAULT CHARACTER SET utf8 のついたSQLが発行されてしまい、エラーになります。 これを防ぐためには charset => '' と、 charset に 空文字列 を指定します。 すると、 DEFAULT から始まる文字コード指定部分がなくなり、 sqlite3 でも php oil migrate が動くようになります。

db.php は次のように書きます。

このようにすると、 環境ごとに別の DB が作成されます。 table_prefixphp oil r migration の時には不要ですが、 php oil r migration:down の時に必要になることがあります。

PostgreSQL を使う場合の注意点

migration ファイル を作っても動きません。 これは Syntax が MySQL とだいぶ違うからです。 FuelPHP に PostgreSQL を使うためのプラグインがあるのでそちらを使うという方法もあります。

charset を空にする

charset に値が入っていると 接続情報(dns)に charset が含まれるようになるのですが、 PostgreSQL はこれを受け付けません。 そこで charset = '' と設定しておきましょう。 この点は SQLITE と同じです。

constraint を削除する

php oil g migration create_xxx のようにして テーブル作成のマイグレーションファイルを作成すると、 id カラム が自動的に作成され、 'constraint' => 11 という設定がされます。 この状態だと テーブル作成の SQL で id カラムは INT(11) に指定されます。 しかし、 PostgreSQL は INT(11) を受け付けません。 INT なら SQL が通ります。

そこで 'constraint' => 11 の設定を削除します。


複数のSQLを一度に実行するためのスクリプト


Oracle では、PL/SQL や CREATE 文 をファイルにしておいて、ファイルにしたスクリプトを実行することができる。

(Windows では) plsql を開き、下のように@マークの後にファイル名を続けて書いて Enter を押せば OK だ。

@"C:Folderxxx.sql" 続きを読む 複数のSQLを一度に実行するためのスクリプト

SQL: 最初のNレコードを抽出する SELECT の書き方


SQL で最初の 限られたレコードを抽出する場合の SELECT文 の書き方です。

続きを読む SQL: 最初のNレコードを抽出する SELECT の書き方

Oracle: Group 化 の際に文字列を結合する


Group 化 する際に 文字列を カンマ区切りで結合する方法を 2つ 紹介します。

続きを読む Oracle: Group 化 の際に文字列を結合する