今天的內容比較輕鬆一點我們來談談 prisma 的 log 跟 debug,log 可以幫我們快速看到 prisma 做了哪些事情,方便我們查詢 DB 操作,debug 則是身為一個軟體工程師都要會的技能~接下來我們就開始今天的內容~
在 prisma 中 logging 有分 level 如下
| Name | Example |
|---|---|
| query | Logs all queries run by Prisma. |
| info | prisma:info Started http server on http://127.0.0.1:58471 |
| warn | Warnings |
| error | Errors |
讀者可以根據自己的需求決定要 log 哪些內容~另外一個值得提的事情是,prisma 本身有兩種 log 的類型:
以下就是 prisma default 的 log 方式,這邊就是把所有的 log level 都打開
const prisma = new PrismaClient({
log: ['query', 'info', 'warn', 'error'],
})
所以假設我簡單 get 一個 user data
const main = async () => {
try {
const user = await prismaClient.user.findFirst()
console.log(user)
} catch (error) {
if (error instanceof ZodError) {
console.log(error.formErrors)
}
}
}
log 的結果如下,可以看到 prisma.info 告訴我們成功連線 prisma ,prisma:query 則是可以看到你做了什麼 query
> tsx --watch index.ts
prisma:info Starting a sqlite pool with 17 connections.
prisma:query SELECT `main`.`User`.`id`, `main`.`User`.`name`, `main`.`User`.`age`, `main`.`User`.`profileViews`, `main`.`User`.`country`, `main`.`User`.`city`, `main`.`User`.`email` FROM `main`.`User` WHERE 1=1 LIMIT ? OFFSET ?
Query: SELECT `main`.`User`.`id`, `main`.`User`.`name`, `main`.`User`.`age`, `main`.`User`.`profileViews`, `main`.`User`.`country`, `main`.`User`.`city`, `main`.`User`.`email` FROM `main`.`User` WHERE 1=1 LIMIT ? OFFSET ?
那其實上面的 log 寫法其實也等同於下方的寫法,因為 emit default 就是 stdout 所以可以不用加上
const prisma = new PrismaClient({
log: [
{
emit: 'stdout',
level: 'query',
},
{
emit: 'stdout',
level: 'error',
},
{
emit: 'stdout',
level: 'info',
},
{
emit: 'stdout',
level: 'warn',
},
],
})
另外一種 logging 的方式就是 Event Based 別於上面的 stdout ,Event Based 則是可能讓你方便拿到 prisma log 的內容好讓你做其他的操作等等
所以使用方式如下,可以看到我們把 query 的內容改成 event ,那要注意的是當你改成 event 的方式,記得要加上 $on 的 callback function 去 subscribes 你要 event 的 logging level
const prisma = new PrismaClient({
log: [
{
emit: 'event',
level: 'query',
},
{
emit: 'stdout',
level: 'error',
},
{
emit: 'stdout',
level: 'info',
},
{
emit: 'stdout',
level: 'warn',
},
],
})
prisma.$on('query', (e) => {
console.log('Query: ' + e.query)
console.log('Params: ' + e.params)
console.log('Duration: ' + e.duration + 'ms')
})
log 的結果如下,可以發現我們成功看到 query 內容、執行時間、與帶入的參數等等,整體看起來簡潔許多
prisma:info Starting a sqlite pool with 17 connections.
Query: SELECT `main`.`User`.`id`, `main`.`User`.`name`, `main`.`User`.`age`, `main`.`User`.`profileViews`, `main`.`User`.`country`, `main`.`User`.`city`, `main`.`User`.`email` FROM `main`.`User` WHERE 1=1 LIMIT ? OFFSET ?
Params: [1,0]
Duration: 2ms
在 prisma 中你要 debug 有提供以下的 cli
>npx prisma debug
你會看到在 prisma 中你要 debug 的內容是需要透過 env 方式告訴 prisma 你要 debug 什麼
For general debugging
- CI:
- DEBUG:
- NODE_ENV:
- RUST_LOG:
- RUST_BACKTRACE:
- NO_COLOR:
- TERM: `xterm-256color`
- NODE_TLS_REJECT_UNAUTHORIZED:
- NO_PROXY:
- http_proxy:
- HTTP_PROXY:
- https_proxy:
- HTTPS_PROXY:
For more information about Prisma environment variables:
See https://www.prisma.io/docs/reference/api-reference/environment-variables-reference
For hiding messages
- PRISMA_DISABLE_WARNINGS:
- PRISMA_HIDE_PREVIEW_FLAG_WARNINGS:
- PRISMA_HIDE_UPDATE_MESSAGE:
For downloading engines
- PRISMA_ENGINES_MIRROR:
- PRISMA_BINARIES_MIRROR (deprecated):
- PRISMA_ENGINES_CHECKSUM_IGNORE_MISSING:
- BINARY_DOWNLOAD_VERSION:
舉個例子來說我想要 DEBUG prisma:client 你只需要塞 DEBUG 的 env 如下:
>export DEBUG="prisma:client"
如果是希望全部的 prisma 的功能都可以 debug 則是如下的寫法
>export DEBUG="prisma*"
或是 DEBUG 的內容全開
>export DEBUG="*"
當你成功 export env 後再打一次 debug 的 cli
>npx prisma debug
這邊你就會看到蠻多資訊的就是
prisma:getSchema prismaConfig {
"data": {
"seed": "tsx prisma/seed/seed.ts"
},
"packagePath": "/Users/danny/develpoment/lib/prisma/package.json"
} +1ms
prisma:getSchema Checking existence of /Users/danny/develpoment/lib/prisma/schema.prisma +0ms
prisma:getSchema Reading schema from single file /Users/danny/develpoment/lib/prisma/schema.prisma +0ms
prisma:getSchema prismaConfig {
"data": {
"seed": "tsx prisma/seed/seed.ts"
},
"packagePath": "/Users/danny/develpoment/lib/prisma/package.json"
} +0ms
prisma:getSchema Checking existence of /Users/danny/develpoment/lib/prisma/schema.prisma +0ms
prisma:getSchema Reading schema from single file /Users/danny/develpoment/lib/prisma/schema.prisma +1ms
prisma:getSchema Checking existence of /Users/danny/develpoment/lib/prisma/prisma/schema.prisma +0ms
prisma:getSchema Reading schema from single file /Users/danny/develpoment/lib/prisma/prisma/schema.prisma +0ms
prisma:getSchema Checking existence of /Users/danny/develpoment/lib/prisma/prisma/schema.prisma +0ms
prisma:getSchema Reading schema from single file /Users/danny/develpoment/lib/prisma/prisma/schema.prisma +0ms
prisma:getSchema Reading schema from multiple files /Users/danny/develpoment/lib/prisma/prisma/schema +0ms
prisma:getSchema Reading schema from multiple files /Users/danny/develpoment/lib/prisma/prisma/schema +4ms
prisma:getConfig Using getConfig Wasm +1ms
prisma:getConfig config data retrieved without errors in getConfig Wasm +8ms
prisma:cli:checkpoint runCheckpointClientCheck(): Execution time for getting info: 15.267291 ms +1ms
prisma:cli:checkpoint runCheckpointClientCheck(): Execution time for "await checkpoint.check(data)": 28.33466599999997 ms +28ms
讀者如果想要玩更多 debug 內容,可以到 官網 看看還有哪些 env 可以設,這邊筆者就不多做介紹,有興趣可以自己玩玩看~
✅ 前端社群 :
https://lihi3.cc/kBe0Y