Paaaack 的 backend API server 在 DB (PostgreSQL) 的操作上是用 Node.js 和 node-postgres 搭配 raw SQL 寫的,原因是當初我跟 ORM (Object Relational Mapping) 並不熟。
後來在工作上有發現,大家基本上都還是會用一層 ORM 來處理 DB 操作, 所以最近就想來時不時升級一下,因為 Prisma 很常聽到,而且官網和文件看起來很棒,所以就選 Prisma 了😆。
根據官網的說明,首先用 Prisma CLI 產生 Prisma schema。
npx prisma init
接著要設定 .env
裡的 DATABASE_URL
讓 Prisma 能連接上。
// .env
PGHOST=db
PGPORT=5432
PGUSER=...
PGPASSWORD=...
PGDATABASE=...
DATABASE_URL=postgresql://PGUSER:PGPASSWORD@PGHOST:PGPORT/PGDATABASE?schema=public
接著 update Prisma schema
npx prisma db pull
接著要能建立 Prisma Client,值得一提的是因為 Paaaack 的 API server 是用 docker 跑的而且沒有把 node_modules 從 container 外 copy 進去,而 Prisma 則是會把 Client 建立在 node_modeuls 裡,所以就必須把產生 Prisma Client 的部分寫在 Dockerfile 裡。
// Dockerfile
...
RUN npx prisma generate
...
最後,就可以用 Prisma Client 來做 DB query,除了 code 變得簡潔以外,還多了 Autocompletion 呢!
// Before
const { Pool } = require('pg');
const pool = new Pool();
...
const client = await pool.connect();
const { rows: packs } = await client.query(
`
SELECT * FROM packs where user_id = $1 and disabled = $2;
`,
[user.id, false],
);
// After
const { PrismaClient } = require('@prisma/client');
const prisma = new PrismaClient();
...
const packs = await prisma.packs.findMany({
where: {
user_id: user.id,
disabled: false,
},
});