herokuでLaravelを動かす際、DBの接続情報は環境変数にセットするのが一般的かと思います。
ただ、毎回heroku config:set DB_HOST=...
とするのも面倒な作業です。
特にheroku postgresの場合、せっかく環境変数に接続文字列入ってるのに...という思いを禁じえません。
そこで、PHPのワンライナー実行でなんとかします。
(RubyでもPythonでもいいけどLaravelの開発するならPHP入ってるでしょという前提)
アプリのディレクトリにcdして以下のコマンドをコピペしてください。
php -r 'preg_match("/^postgres:\/\/(.+?):(.+?)@(.+?):(.+?)\/(.*?)$/", `heroku config:get DATABASE_URL`, $matches); `heroku config:set DB_CONNECTION=pgsql DB_HOST=$matches[3] DB_PORT=$matches[4] DB_DATABASE=$matches[5] DB_USERNAME=$matches[1] DB_PASSWORD=$matches[2]`;'
前提
- PHP 入ってる
- Heroku CLI 入ってる
- heroku アプリ作成済み
- heroku postgres 追加済み
うまく動かないときは
-
heroku config:get
,heroku config:set
で--app
オプションつけて対象アプリを明示する -
heroku config
で環境変数にDATABASE_URLが追加されているか確認する - コピペしたときに
'
や"
や`
が勝手に変換されてないか確認する
解説
php -r '...'
→引数で渡されたPHPコードを実行しているだけです。
以下PHPのコードの解説ですが、このコードの肝は
PHPではバッククォートで囲った部分がコマンドとして実行され、結果が文字列として返ってくる
という点に尽きます。
preg_match("/^postgres:\/\/(.+?):(.+?)@(.+?):(.+?)\/(.*?)$/", `heroku config:get DATABASE_URL`, $matches);
→herokuの環境変数からPostgresの接続文字列を引っこ抜いて正規表現で分割してます。
前述のとおり`heroku config:get DATABASE_URL`
でherokuのコマンドを叩いて結果を取得しています。
`heroku config:set DB_CONNECTION=pgsql DB_HOST=$matches[3] DB_PORT=$matches[4] DB_DATABASE=$matches[5] DB_USERNAME=$matches[1] DB_PASSWORD=$matches[2]`
→同じようにherokuを叩き、今度はherokuの環境変数に値をセットします。
`
に囲まれた部分でも変数展開が有効です。
余談ですが$(var)
形式の変数展開を使うとコマンドラインの変数展開とバッティングしてエラーになります。
検証環境
macOS Sierra v10.12.6
php v5.6.30(herokuではなくローカルのPHP)
heroku-cli v6.14.24-72dfccf