BeginnerEngineerBlog
中の人
中の人

【heroku postgresql laravel docker salesforce】ローカルからlaravelでherokuのpostgresqlにアクセス

公開: 2024-11-14 13:47
更新: 2024-12-11 16:54
30
postgresql heroku laravel8.x docker salesforce
dockerで立ち上げたローカルからherokuのデータベースにアクセスする方法メモ

こんにちは!

中の人です

herokuのpostgresqlに接続するメモです


Dockerfile


抜粋
RUN set -x \
    && apk add --no-cache \
        git \
        shadow \
        libzip-dev \
        postgresql-dev \ 👈 必要(apt-getだと"libpq-dev"のはず)
    && docker-php-ext-install \
        bcmath \
        opcache \
        pdo_mysql \
        pdo_pgsql \ 👈 必要
        zip


database.php


抜粋
        'heroku_db' => [
            'driver' => 'pgsql', // 👈 postgresqlに接続する場合
            'host' => env('HEROKU_DB_HOST', '127.0.0.1'),
            'port' => env('HEROKU_DB_PORT', '3306'),
            'database' => env('HEROKU_DB_DATABASE', 'forge'),
            'username' => env('HEROKU_DB_USERNAME', 'forge'),
            'password' => env('HEROKU_DB_PASSWORD', ''),
            'charset' => 'utf8',
            'prefix' => '',
            'schema' => 'hogehuga', // 👈 必要に応じてschemaを指定
            'sslmode' => 'require', // 👈 ssl接続しないといけないっぽい(https://devcenter.heroku.com/ja/articles/connecting-heroku-postgres)
            'options' => [
                'sslrootcert' => storage_path('ap-northeast-1-bundle.pem'), // 👈 認証局バンドルのpathを指定
                'sslcert' => '',
                'sslkey' => '',
            ]
        ],


ちなみに".pem"を省略して'ap-northeast-1-bundle'と記載しても大丈夫でした

※ 20241211追記
database.phpの設定について補足を記事後半に追加しました🙇

.env


抜粋
HEROKU_DB_HOST=hogehuga
HEROKU_DB_PORT=1234
HEROKU_DB_DATABASE=hogehuga
HEROKU_DB_USERNAME=hogehuga
HEROKU_DB_PASSWORD=hogehuga

それぞれ接続に必要な値をセット


storage


好きな場所に証明書バンドルを置く
storage
├── ap-northeast-1-bundle.pem // 👈 ひとまずここに置い


Model


<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Test extends Model // 👈 ひとまずTestにしたけどテーブル名に合わせて調整
{
    protected $table = 'hogehuga'; // 👈 必要に応じて接続したいテーブル名指定

    protected $connection = 'heroku_db'; // 👈 database.phpで設定した設定を指定

    protected $guarded = [
        'id',
        'created_at',
    ];
}


サンプル


public function hogehuga(Request $request)
{
    $test = Test::query()->first();
    return view(
        'hoge',
        [
            'test' => $test,
        ]
    )
}

普通に利用できるはず


(20241211database.php補足追加🙇)insert update delete


※ この記事で紹介しているherokuはsalesforceと連携しています
もしかしたらsalesforceとの連携がない場合は、この追記の内容は当てはまらないかもしれません

insertやupdateする際に以下エラーが発生しました

function get_xmlbinary() does not exist

参考:

function hstore(hoge_table) does not exist

参考:

これはdatabase.phpのschemaが正しく設定されていない場合に発生します

正しくは

        'heroku_db' => [
            // ~~省略
            'schema' => ['hogehuga', 'public', 'heroku_ext'], // 👈 配列にして"public"と"heroku_ext"を追加
            // ~~省略
        ],

となります
値取得できてイェーイと思って記事上げましたが甘かったっす(>人<;)サーセン

※ 省略内容については前述のdatabase.phpの設定を参照してください


function get_xmlbinary() does not exist


このエラーが出た場合は
        'heroku_db' => [
            // ~~省略
            'schema' => ['hogehuga', 'public'], // 👈 配列にしてpublicを追加
            // ~~省略
        ],

これで上記のエラーは解消されます

function hstore(hoge_table) does not exist


上記'public'を追加した後にこのエラーが発生しました
この場合は

        'heroku_db' => [
            // ~~省略
            'schema' => ['hogehuga', 'public', 'heroku_ext'], // 👈 配列にしてheroku_extを追加
            // ~~省略
        ],

これで上記のエラーは解消されます

なんぞ


なんかよくわかりませんが、herokuのpostgresqlにインストールされている拡張機能(Functions)が別々?のschemaにインストールされているみたいで?参照したいテーブルがあるschemaのみ(hogehugaのみ)指定してinsertやupdateすると、postgresql内でsalesforceと同期するための関数がトリガーされるんですが、その際に利用している拡張機能の関数が別のschemaにあるため、「hogehuga内でインストールされている拡張機能の関数探したけど、ないっすよ」的なエラーが発生するとのことでした

ちなみに

sqlクライアントなどでherokuのpostgresqlに接続して、参照テーブルでinsert文とか書くと同じエラーが発生します

その際、

SET search_path TO hogehuga, public, heroku_ext;

を実行してsearch_pathを変更してからinsertやupdate文を流したら成功しました
ご参考まで!(*>∀<)ノ))クソハマッタワボケナス!!


終わりに


終わり!!\(^o^)/
0
0
0
0
通信エラーが発生しました。
【広告】
似たような記事