Heroku Data Links
この記事の英語版に更新があります。ご覧の翻訳には含まれていない変更点があるかもしれません。
最終更新日 2021年12月28日(火)
Table of Contents
Heroku Data Links を使用すると、Heroku Postgres データベースに異種のデータソース (Heroku Postgres など) を容易に接続できます。 接続すると、データが存在する場所に関係なく、SQL セマンティックスを使用してデータを読み取りおよび書き込みできます。
Heroku Data Links は、Hobby 層のデータベースでは使用できません。
概要
Heroku Data Links は、外部データラッパーと呼ばれる Postgres のネイティブ機能を使用します。外部データラッパーは、外部サーバーの外部テーブルの論理表現をローカルデータベースのテーブルにマップします。
リモートデータベース内のデータに対するクエリを記述すると、Postgres はリモートデータに対して透過的にクエリを実行します。データが存在する場所や、それが Postgres でどのように抽象化されているかの詳細は、2 つのデータストアを接続する Postgres 拡張機能にプッシュダウンされます。
Heroku Data Links は、ローカルデータベース内でのサーバー仕様の作成や、リモートシステムでクエリを実行する対象のテーブルの作成など、外部データラッパーを管理するための困難な部分を処理します。
用語
Heroku Data Links に関するドキュメントでは、厳密な一連の用語を使用してすべての対話を定義します。
- リモート - Heroku Postgres データベースに接続されているデータストア。
- ローカル - 接続を受け付けている Heroku Postgres データベース。
- データリンク - リモートデータベースとローカルデータベースの間の接続の名前。
データリンクの一覧表示
作成されているデータリンクはすべて、Heroku CLI 経由で一覧表示できます。
$ heroku pg:links -a example-app
=== postgresql-animate-91581
* datalink_test
created_at: 2021-10-11T14:46:22.721+00:00
remote: HEROKU_POSTGRESQL_BLUE_URL (postgresql-colorful-33594)
remote_name: postgresql_colorful_33594
=== postgresql-colorful-33594
No data sources are linked into this database.
=== postgresql-round-06985
This operation is not supported by hobby-dev databases
このコマンドは、アプリケーションにアタッチされているすべてのデータベースおよび各データベース内に存在するリンクを一覧表示します。上記の例では、DATABASE_URL
がローカルデータベースであり、そのリソースアドオン名 warming-calmly-5763
とも呼ばれます。
Remote:
行は、DATABASE_URL
に接続されているデータベースの環境設定とリソース名を参照しています。Remote Name
は、DATABASE_URL
データベース内のサーバー参照です。
Heroku Postgres の Heroku Postgres へのリンク
Heroku Postgres を別の Heroku Postgres データベースにリンクすることもできます。
$ heroku pg:links:create HEROKU_POSTGRESQL_BLUE HEROKU_POSTGRESQL_RED --as datalink_test -a example-app
Heroku Postgres インスタンスがリンクされると、そのリンク名に基づいて Postgres に新しいスキーマが追加されます (この場合は、datalink_test
スキーマ)。リモートデータストア HEROKU_POSTGRESQL_BLUE
内に people
テーブルがある場合は、HEROKU_POSTGRESQL_RED
データベースから、そのテーブルに次のようにクエリを実行できます。
SELECT * FROM datalink_test.people;
リンク作成の時点で存在するテーブルのみが使用可能になります。リンクを作成した後にテーブルを作成した場合、それらのテーブルはローカルデータベースに表示ません。新しく作成されたテーブルを含める場合は、リンクを削除し、もう一度作成する必要があります。
リモートデータストアを削除するか、またはリモートデータストアが別のホストに移動された (Postgres フェイルオーバーなど) 場合、データリンクは更新されません。また、heroku pg:reset
などのコマンドでローカルデータベースをリセットした場合は、データリンクの情報もリセットされます。これらの場合は、データリンクを作成し直す必要があります。
Heroku Redis の Heroku Postgres へのリンク
2018 年 1 月 30 日の時点で、Heroku Redis から Heroku Postgres への Heroku Data Links の作成は非推奨になりました。
データリンクの名前付け
リンクを作成する場合は、それにわかりやすい名前を付けることをお勧めします。リンク名を指定するには、--as
フラグを使用します。
$ heroku pg:links:create HEROKU_POSTGRESQL_BLUE HEROKU_POSTGRESQL_RED --as datalink_test -a example-app
名前には小文字の英数字とアンダースコアのみを使用し、最大の長さは 63 文字とする必要があります。
データリンクに名前が付けられた場合、リモートの Postgres テーブルには --as
フラグと同じ名前を使用してクエリを実行する必要があります。
SELECT id, name, description FROM datalink_test.remote_table_name;
データリンクの削除
CLI 経由でデータリンクを削除するには、次のようにします。
$ heroku pg:links:destroy HEROKU_POSTGRESQL_BLUE datalink_test -a example-app
! WARNING: Destructive Action
! This command will affect the database: DATABASE
! This will delete datalink_test along with the tables and views created within it.
! This may have adverse effects for software written against the datalink_test schema.
! To proceed, type "example-app" or re-run this command with --confirm example-app
> example-app
Deleting link datalink_test in DATABASE... done
Postgres テーブルに対して、データリンクから来た何らかのビューまたはコードが記述されている場合、データリンクが削除される前にチェックは行われません。