今天的內容比較輕鬆一點我們來談談 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