Quickly developing REST APIs with PostgRESTの翻訳です。
2022年1月20日
PostgRESTでREST APIを素早く開発する
データベースへのHTTPインタフェースを設定するのは大変な作業です。PostgreSQL®へのRESTfulなアクセスを提供するために、PostgRESTがどのように迅速で簡単かをご覧ください。
PostgreSQL® + RESTful API = PostgRESTです!
今日では、リレーショナルデータベースに情報を格納し、RESTfulなHTTPインターフェイスを介してデータを操作することは非常に一般的な開発パターンです。
今日はPostgRESTという便利なツールを紹介します。これはPostgreSQLデータモデルから直接*RESTful APIを生成するもので、独自のインタフェースを書く必要がなくなります。データベースレイヤーとしてAiven for PostgreSQLを使用し、Kaggleの素敵なデータセットを使用します。
AivenでPostgreSQLサービスを作成する
今日のデータベースはAiven for PostgreSQLです。まだアカウントをお持ちでない方は、サインアップして無料トライアルをお楽しみください!また、Aiven CLIを使用します。GitHubページのインストールと認証手順に従ってください。
CLIをインストールした状態で、ターミナルに以下のコマンドを入力し、PostgreSQLサービスを作成します:
avn service create --service-type pg --cloud google-europe-west3 --plan hobbyist pg-quotes`クリップボードにコピーする
これでPostgreSQLサービスが稼働するようになりました!
データを取得する
データベースを作成するために、この素敵なGoodreads Quotes dataset from Kaggleを使う。そのページに行き、quotes.csv
ファイルをカレントディレクトリにダウンロードする。このファイルには、冒険を始めるために必要な全てのデータが含まれている。
CSVファイルを見ると、以下の列がある:
- index`: 見積もりID
- 引用そのもの
-
author
: 引用の作成者 -
tags
: 引用を分類する文字列のリスト -
likes
: Goodreads上で引用が何いいねされたか。
このデータ構造を保持するためにデータベースのテーブルを作成する。
PostgreSQLを設定する
データセットを手に入れたので、今度はそれをPostgreSQLにインポートします。また、後でPostgRESTとやりとりするためのスキーマとロールを作成します。
ターミナルで、便利なavn service cli
を使ってPostgreSQLコンソールに接続してください:
avn service cli pg-quotes`クリップボードにコピーする
コンソールで今日の最初のSQLコマンドを実行する。テーブルとデータを保持するためにapi
という新しいスキーマを作成する:
CREATE SCHEMA api;`クリップボードにコピーする
ここで、先ほど検査したCSVカラムを基にquotes
というテーブルを作成する:
CREATE TABLE api.quotes (
index SERIAL、
quote TEXT、
author VARCHAR(255)、
tags TEXT、
同類 INTEGER
);`クリップボードにコピー
indexフィールドは
SERIAL 型で、新しい引用が追加されるたびに自動的にインクリメントされます。しかし、CSVファイルにはすでに
2999までのインデックスがあるので、新しい引用は
3000`から始まるインデックスフィールドを持つ必要がある。次のコマンドはそれを実行する:
ALTER SEQUENCE api.quotes_index_seq RESTART WITH 3000;`クリップボードにコピーする
api.quotes_index_seqは、上記のテーブルを作成したときに自動的に作成された。名前のパターンは
.__seq` です。
PostgreSQLには
COPY
というファイルとテーブルの間でデータを移動するSQLコマンドがあります。これはCSVファイルで非常に便利です。コンソールコマンドのCOPYCOPY
はCOPY
を使用しますが、ローカルのファイルシステムから読み込む方法を知っています。以下のコードを実行して、quotes.csv
からすべての行をテーブルにインポートする:COPY api.quotes FROM 'quotes.csv' CSV HEADER;`クリップボードにコピーする
PostgRESTはPostgreSQLのロールをRESTful APIユーザとして使用します。データに対するすべての権限を持つ
operator
という名前のロールを作成してみよう:CREATE ROLE operator nologin; GRANT usage ON SCHEMA api TO operator; GRANT all ON api.quotes TO operator; GRANT usage, SELECT ON SEQUENCE api.quotes_index_seq TO operator;`Copy to clipboard
この例では、operator
は非常に広範なデータアクセスを持っています。PostgRESTはJSON Web Tokensによる認証をサポートしています。もっと知りたければ公式ドキュメントを読んでください!PostgreSQLの設定ができました!
次に、PostgRESTに飛び込んでHTTPインターフェースを取得しましょう。
新しい友達を紹介しよう:PostgREST
PostgRESTはPostgreSQLデータベースをHTTP RESTful APIとして魔法のように公開するWebサーバです。
よく知られたPostgreSQLの機能に依存しています。例えば、ロールはAPIユーザになり、SQL操作はクエリパラメータになり、ストアドプロシージャはAPIエンドポイントとして利用できます。
今日はローカルマシン上でPostgRESTを実行しますが、単一のバイナリやDockerコンテナを実行できるプラットフォームであれば、どのようなものでもデプロイできます。例えば、仮想マシンやHerokuアプリを使うこともできます。
SupabaseやRetoolのようないくつかの主要なツールは、APIレイヤーとしてPostgRESTを使っています。また、PostgRESTには活発なコミュニティがあります。Gitterルームで開発者やユーザーに追いつくことができます。
PostgRESTの実行
PostgRESTはすべての主要なパッケージマネージャで単一のバイナリとして利用可能です。先に進む前に、公式の説明書 に従ってあなたのマシンにインストールしてください。
最後に必要なのは、PostgRESTとPostgreSQLの接続です。まず、Aiven CLIを使ってPostgreSQLの接続文字列を取得します:
avn service get pg-quotes --format '{service_uri}'`Copy to clipboard
出力された内容で、
postgrest.conf
というファイルを作成する:db-uri = "<前のコマンドからの出力>" db-schema = "api" db-anon-role = "operator"`クリップボードにコピーする
見ての通り、
db-schema
とdb-anon-role
は以前に作成したスキーマとロールを参照している。最後に、以下のコマンドを実行して PostgREST サーバを起動してみよう:
`postgrest postgrest.conf`クリップボードにコピーする
すべてがスムーズにいけば、サーバーはローカルで
http://localhost:3000
アドレスで動作している。RESTful APIを調べる
設定が多いように感じるが、自分でCRUDバックエンドアプリを書くよりは少ない。すべての設定が整ったところで、どのようなリクエストができるかを調べてみよう。
この基本的なHTTPリクエストはすべての見積もりを返す:
`curl "http://localhost:3000/quotes"`クリップボードにコピーする
PostgRESTはあらゆる種類のフィルタをサポートしています。例えば、
limit=N
クエリパラメータを使用することで、出力を5つの引用符に制限することができます:curl "http://localhost:3000/quotes?limit=5"`クリップボードにコピーする
field=filter.value
パターンを使用して、1000以上の「いいね!」を持つ引用のみを返すようにHTTPクエリフィルタを拡張し、
select`オプションで表示するフィールドを選択することができます:curl "http://localhost:3000/quotes?limit=5&likes=gt.1000&select=index,quote,author"`クリップボードにコピーする
SQLに似ていると感じるかもしれませんが、それはPostgRESTがPostgreSQLの既存の機能を使うように最善を尽くしているからです。
これまでのところ、CRUDからのreadだけを調べてきました。
HTTPのPOSTメソッドを使用して、新しい見積もりを追加します:
curl "http://localhost:3000/quotes" -X POST -H "Content-Type: application/json" ୧-͈ᴗ-͈́)◞ʱʱ -d \ ' { "author":"Paulo Freire"、 "引用":「教育が解放的でないとき、抑圧された者の夢は抑圧者になることである。 } '`クリップボードにコピーする
新しいエントリーが正しく追加されたかどうかは、実行することで確認できる:
curl "http://localhost:3000/quotes?index=eq.3000"`クリップボードにコピーする
先ほど追加した引用を更新するには、HTTP PATCH 動詞を使用して、引用に
tags
フィールドをindex
値3000
で追加します:curl "http://localhost:3000/quotes?index=eq.3000" -X PATCH -H "Content-Type: application/json" ୧-͈ᴗ-͈́)◞ʾʾ -d \ ' { "tags":"教育;感動;哲学;知恵" } '`クリップボードにコピー
最後に、HTTP DELETE動詞を使って、
author
フィールドに`?`curl -X DELETE "http://localhost:3000/quotes?author=like.˶*??˶*"`クリップボードにコピーする
次のステップ
PostgRESTは、高度なプログラミング言語やウェブフレームワークを使わずにRESTful APIを立ち上げるための便利なツールです。今日はPostgRESTの基本的な部分にしか触れませんでしたが、もっと試してみたいという方には、PostgRESTのドキュメントからお勧めのトピックをいくつか紹介します:
まとめ
Aivenのサービスをまだご利用でない方はhttps://console.aiven.io/signupから無料トライアルにお申し込みください!
また、changelogやblogのRSSフィード、またはLinkedInやTwitterのアカウントをフォローし、製品や機能関連の最新情報をご確認ください。
Postgres、PostgreSQLおよびSlonikロゴは、PostgreSQL Community Association of Canadaの商標または登録商標であり、その許可を得て使用しています。
参考文献
- PostgreSQL® の使用例
- リモートリードレプリカ - 何を、なぜ、どのように