3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Laravel】PostgreSQLのスキーマを切り替える

Posted at

はじめに

PostgreSQLには、DBとテーブルの間にスキーマという概念があります。
今回、同じDB内でスキーマを切り替える処理を学んだので、残しておきます。

結論

database.phpに、スキーマ名だけを変えたDB設定を違う名前で書いておいて、
DB::connectionであたかもDBを切り替えるようにして、スキーマだけを切り替える。

初期状態

初期状態はpublicスキーマが指定されてます。

database.php

'pgsql' => [
            'driver' => 'pgsql',
            'url' => env('DATABASE_URL'),
            'host' => env('DB_HOST', '127.0.0.1'),
            'port' => env('DB_PORT', '5432'),
            'database' => env('DB_DATABASE', 'forge'),
            'username' => env('DB_USERNAME', 'forge'),
            'password' => env('DB_PASSWORD', ''),
            'charset' => 'utf8',
            'prefix' => '',
            'prefix_indexes' => true,
            'schema' => 'public',
            'sslmode' => 'prefer',
        ],

実装

通常の設定の下にスキーマのところだけtestに変えた、
別名の設定(ここではpgsqltest)を書いておく。
(実際の実装では、スキーマの指定はenvヘルパで指定しました。)

database.php

'pgsql' => [
            'driver' => 'pgsql',
            'url' => env('DATABASE_URL'),
            'host' => env('DB_HOST', '127.0.0.1'),
            'port' => env('DB_PORT', '5432'),
            'database' => env('DB_DATABASE', 'forge'),
            'username' => env('DB_USERNAME', 'forge'),
            'password' => env('DB_PASSWORD', ''),
            'charset' => 'utf8',
            'prefix' => '',
            'prefix_indexes' => true,
            'schema' => 'public',
            'sslmode' => 'prefer',
        ],

'pgsqltest' => [
            'driver' => 'pgsql',
            'url' => env('DATABASE_URL'),
            'host' => env('DB_HOST', '127.0.0.1'),
            'port' => env('DB_PORT', '5432'),
            'database' => env('DB_DATABASE', 'forge'),
            'username' => env('DB_USERNAME', 'forge'),
            'password' => env('DB_PASSWORD', ''),
            'charset' => 'utf8',
            'prefix' => '',
            'prefix_indexes' => true,
            'schema' => 'test',
            'sslmode' => 'prefer',
        ],

利用

以上で設定は完了です。
あとは下記のように通常でない方を利用するときのみ、
DB::connectionで切り替えるだけです。

TestController.php

$accounts = \DB::connection('pgsqltest')
    ->table('account')
    ->get();

まとめ

今までMySQLばかり使っていたので、あまり馴染みがないやり方でした。
正直他にも良い方法があったら知りたいです。

スキーマに関して調べて見ると、スキーママネージャー(下記)のようなものがあったので、
こういうのを追加しないと、スキーマを操作するのは難しいのかなという印象です。

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?