3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

PostgRESTでREST APIを素早く開発する

Posted at

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ファイルで非常に便利です。コンソールコマンドのCOPYCOPYCOPYを使用しますが、ローカルのファイルシステムから読み込む方法を知っています。以下のコードを実行して、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アプリを使うこともできます。

SupabaseRetoolのようないくつかの主要なツールは、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-schemadb-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 フィールドを index3000 で追加します:

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から無料トライアルにお申し込みください!

また、changelogblogのRSSフィード、またはLinkedInTwitterのアカウントをフォローし、製品や機能関連の最新情報をご確認ください。

Postgres、PostgreSQLおよびSlonikロゴは、PostgreSQL Community Association of Canadaの商標または登録商標であり、その許可を得て使用しています。

参考文献

3
0
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
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?