Integrating Prisma as an ORM for the Node.js and PostgreSQL-based API Server | Paaaack

Yes Lee
4 min readJul 4, 2024

--

Mount Kinabalu, Sabah, Malaysia | Apr. 2024

Paaaack 的 backend API server 在 DB (PostgreSQL) 的操作上是用 Node.js 和 node-postgres 搭配 raw SQL 寫的,原因是當初我跟 ORM (Object Relational Mapping) 並不熟。

後來在工作上有發現,大家基本上都還是會用一層 ORM 來處理 DB 操作, 所以最近就想來時不時升級一下,因為 Prisma 很常聽到,而且官網和文件看起來很棒,所以就選 Prisma 了😆。

https://www.prisma.io/docs/getting-started

根據官網的說明,首先用 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,
},
});
https://paaaack.com/en/packing-lists/multi-day-hike-packing-list

--

--