# 一個 PostgreSQL 搞定 CRUD - PostgREST
各位 backend engineer 對於 CRUD 的粗活肯定都是非常的熟悉,雖然只是一件非常簡單的事情,但每次要做起來卻還是令人十分痛苦。
如果我們今天要以 Java Spring Boot + PostgreSQL 來寫一個最最陽春的會員系統,並且上線給大家都可以使用,就會需要以下的粗活。
- Init Sprint Boot Project
- Init PostgreSQL Server
- Create "user" Table
- Use Sprint Data JPA Write CRUD....
- Deploy Spring Boot Application
光想到我就已經想要放棄了
## 可不可以簡單一點

沒錯,光是看到這張圖,我想聰明的大家已經想到我想要幹什麼了,光是從字面上看,就知道這是一個融合了 PostgreSQL + RESTful API 的偉大產物。
如果...如果你可以只把 PostgreSQL 架起來,把表寫好,接著就有現成的 CRUD REST API 可以使用,豈不妙哉!對於一個 Side Project 來說正是一個神器。
## 但我連 PostgreSQL Server 都沒有
這邊介紹另一個服務 [supabase](https://github.com/supabase/supabase/blob/master/i18n/README.zh-tw.md)
>Supabase 是 Firebase 的開放原始碼替代方案。我們以企業等級的開放原始碼工具,打造 Firebase 的功能。
提供你一個非常親切的免費方案去使用 PostgreSQL,而且裡面就有 PostgREST 可以使用

## 那,我們就上囉!
一開始免不了,就是設定專案名稱,還有資料庫的密碼,選擇一下 Region。

建立好之後會需要等待一段時間,會看到有一個 `Setting up project`

這邊我們來新建一張 table

既然是一個會員登入系統,那就來張 user table 吧!

接著到我們的 setting page 找到下面這三樣資訊
1. URL
2. anon (which is safe to be used in a browser context.)
3. service_role (which should only be used on a server. This key can bypass Row Level Security. NEVER use this key in a browser)

切換到左下角第二個選項 API Docs,我們就可以在 `Tables and Views` 這邊看到 `user` table,右手邊就是對應 JavaScript 或者是 curl 的操作指令。

## 拋棄那些浪費生命的簡單 CRUD Web Application 吧
這是我們一般想要新增一個使用者,會使用到的 SQL,寫起來也是很煩,還要開 API Endpoint 出去給前端串接。
```sql
insert into "user" (name) values ('timm');
```
不過在 PostgREST 的幫助之下,我們 table 建立好的時候,這些簡單的 CRUD 都已經準備好,我們根本不需要自己去寫那些 Entity, Repository, Controller,更別說還得要部署上去雲端了。
下方範例都**請記得替換 {service_role}**
透過 API 新增一位使用者的資料
```bash
curl --location --request POST 'https://pebbcfmmpazuuuoeujxq.supabase.co/rest/v1/user' \
--header 'apikey: {service_role}' \
--header 'Authorization: Bearer {service_role}' \
--header 'Content-Type: application/json' \
--header 'Prefer: return=representation' \
--data-raw '{ "name": "timm"}'
```
response
```json
[
{
"id": 1,
"name": "timm",
"created_at": "2022-11-24T14:22:43.167883+00:00"
}
]
```
透過 API 取得全部使用者的資料
```bash
curl --location --request GET 'https://pebbcfmmpazuuuoeujxq.supabase.co/rest/v1/user?select=*' \
--header 'apikey: {service_role}' \
--header 'Authorization: Bearer {service_role}'
```
response
```json
[
{
"id": 1,
"name": "timm",
"created_at": "2022-11-24T14:22:43.167883+00:00"
}
]
```
看到這邊,其實只是 PostgREST 的一角,如果你有個 Side Project 只是需要非常簡單的 CRUD ,不妨可以考慮透過這樣的方式去跟資料庫做互動吧!