iT邦幫忙

2024 iThome 鐵人賽

DAY 22
0
Modern Web

一些讓你看來很強的 ORM - prisma系列 第 22

Day22. 一些讓你看來很強的 ORM - prisma ( Logging & Debug)

  • 分享至 

  • xImage
  •  

今天的內容比較輕鬆一點我們來談談 prismalogdebuglog 可以幫我們快速看到 prisma 做了哪些事情,方便我們查詢 DB 操作,debug 則是身為一個軟體工程師都要會的技能~接下來我們就開始今天的內容~

Logging

prismalogging 有分 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 的類型:

  • Logging to stdout (default)
  • Event-based logging (使用 $on 去訂閱事件)

Logging to Stdout

以下就是 prisma defaultlog 方式,這邊就是把所有的 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 告訴我們成功連線 prismaprisma: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',
    },
  ],
})

Event Based Logging

另外一種 logging 的方式就是 Event Based 別於上面的 stdoutEvent Based 則是可能讓你方便拿到 prisma log 的內容好讓你做其他的操作等等

所以使用方式如下,可以看到我們把 query 的內容改成 event ,那要注意的是當你改成 event 的方式,記得要加上 $oncallback functionsubscribes 你要 eventlogging 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

Debug

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 你只需要塞 DEBUGenv 如下:

>export DEBUG="prisma:client"

如果是希望全部的 prisma 的功能都可以 debug 則是如下的寫法

>export DEBUG="prisma*"

或是 DEBUG 的內容全開

>export DEBUG="*"

當你成功 export env 後再打一次 debugcli

>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


上一篇
Day21. 一些讓你看來很強的 ORM - prisma ( Seed Data)
下一篇
Day23. 一些讓你看來很強的 ORM - prisma ( Aggregate & Group by)
系列文
一些讓你看來很強的 ORM - prisma30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言