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

<font color="Grey">*[Quickly developing REST APIs with PostgREST](https://aiven.io/blog/quickly-developing-rest-apis-with-postgrest)の翻訳です。*</font>

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](https://aiven.io/postgresql)です。まだアカウントをお持ちでない方は、[サインアップ](https://console.aiven.io/signup)して無料トライアルをお楽しみください！また、[Aiven CLI](https://github.com/aiven/aiven-client)を使用します。[GitHubページ](https://github.com/aiven/aiven-client#install-from-pypi)のインストールと認証手順に従ってください。


CLIをインストールした状態で、ターミナルに以下のコマンドを入力し、PostgreSQLサービスを作成します：



```
avn service create --service-type pg --cloud google-europe-west3 --plan hobbyist pg-quotes`クリップボードにコピーする
```

これでPostgreSQLサービスが稼働するようになりました！


### データを取得する


データベースを作成するために、この素敵な[Goodreads Quotes dataset from Kaggle](https://www.kaggle.com/abhishekvermasg1/goodreads-quotes)を使う。そのページに行き、`quotes.csv`ファイルをカレントディレクトリにダウンロードする。このファイルには、冒険を始めるために必要な全てのデータが含まれている。


CSVファイルを見ると、以下の列がある：


* index`: 見積もりID
* 引用そのもの
* `author`: 引用の作成者
* `tags`: 引用を分類する文字列のリスト
* `likes`: Goodreads上で引用が何いいねされたか。


このデータ構造を保持するためにデータベースのテーブルを作成する。


### PostgreSQLを設定する


データセットを手に入れたので、今度はそれをPostgreSQLにインポートします。また、後でPostgRESTとやりとりするためのスキーマとロールを作成します。


ターミナルで、便利な`avn service cli`を使ってPostgreSQLコンソールに接続してください：



```
avn service cli pg-quotes`クリップボードにコピーする
```

コンソールで今日の最初のSQLコマンドを実行する。テーブルとデータを保持するために`api`という新しい[スキーマ](https://www.postgresql.org/docs/11/ddl-schemas.html)を作成する：



```
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;`クリップボードにコピーする
```


> ![](/build/_assets/shape-quote-WGSAHX4E.svg)
> api.quotes_index_seq`は、上記のテーブルを作成したときに自動的に作成された。名前のパターンは `<SCHEMA>.<TABLE>_<COLUMN>_seq` です。
>
>
>


PostgreSQLには[`COPY`](https://www.postgresql.org/docs/11/sql-copy.html)というファイルとテーブルの間でデータを移動するSQLコマンドがあります。これはCSVファイルで非常に便利です。コンソールコマンドの[`COPYCOPY`](https://www.postgresql.org/docs/11/app-psql.html#APP-PSQL-META-COMMANDS-COPY)は`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
```


> ![](/build/_assets/shape-quote-WGSAHX4E.svg)
> この例では、`operator`は非常に広範なデータアクセスを持っています。PostgRESTはJSON Web Tokensによる認証をサポートしています。もっと知りたければ[公式ドキュメント](https://postgrest.org/en/v8.0/auth.html)を読んでください！
>
>
>


PostgreSQLの設定ができました！


次に、PostgRESTに飛び込んでHTTPインターフェースを取得しましょう。


### 新しい友達を紹介しよう：PostgREST


[PostgREST](https://postgrest.org/en/v8.0/)はPostgreSQLデータベースをHTTP RESTful APIとして魔法のように公開するWebサーバです。


よく知られたPostgreSQLの機能に依存しています。例えば、ロールはAPIユーザになり、SQL操作はクエリパラメータになり、ストアドプロシージャはAPIエンドポイントとして利用できます。


今日はローカルマシン上でPostgRESTを実行しますが、単一のバイナリや[Dockerコンテナ](https://postgrest.org/en/v8.0/install.html#docker)を実行できるプラットフォームであれば、どのようなものでもデプロイできます。例えば、仮想マシンや[Herokuアプリ](https://postgrest.org/en/v8.0/install.html#deploying-to-heroku)を使うこともできます。


[Supabase](https://supabase.io/database)や[Retool](https://retool.com)のようないくつかの主要なツールは、APIレイヤーとしてPostgRESTを使っています。また、PostgRESTには活発なコミュニティがあります。[Gitterルーム](https://gitter.im/begriffs/postgrest)で開発者やユーザーに追いつくことができます。


### PostgRESTの実行


PostgRESTはすべての主要なパッケージマネージャで単一のバイナリとして利用可能です。先に進む前に、[公式の説明書](https://postgrest.org/en/v8.0/install.html) に従ってあなたのマシンにインストールしてください。


最後に必要なのは、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は[あらゆる種類のフィルタ](https://postgrest.org/en/v8.0/api.html)をサポートしています。例えば、`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の既存の機能を使うように最善を尽くしているからです。


これまでのところ、C**R**UDからの**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のドキュメントからお勧めのトピックをいくつか紹介します：


* [認証システム](https://postgrest.org/en/v8.0/auth.html)
* [ストアドプロシージャの作成](https://postgrest.org/en/v8.0/api.html#stored-procedures)
* [PostgREST アプリと拡張](https://postgrest.org/en/v8.0/ecosystem.html#example-apps)


## まとめ


Aivenのサービスをまだご利用でない方は<https://console.aiven.io/signup>から無料トライアルにお申し込みください！


また、[changelog](https://aiven.io/changelog)や[blog](https://aiven.io/blog)のRSSフィード、または[LinkedIn](https://www.linkedin.com/company/aiven/)や[Twitter](https://twitter.com/aiven_io)のアカウントをフォローし、製品や機能関連の最新情報をご確認ください。



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


## 参考文献


* [PostgreSQL® の使用例](https://aiven.io/blog/use-cases-for-postgresql)
* リモートリードレプリカ - 何を、なぜ、[どのように](https://aiven.io/blog/postgresql-remote-read-replica)