drizzle的基本使用

800 阅读1分钟

本文所用相关包的版本

  • drizzle-orm 0.30.10
  • postgres 3.4.4
  • drizzle-kit 0.21.4

安装drizzle

pnpm add drizzle-orm postgres
pnpm add -D drizzle-kit

声明schema

创建src/schema.ts

代码如下:

import { serial, text, timestamp, pgTable } from 'drizzle-orm/pg-core'

export const messages = pgTable('messages', {
  id: serial('id').primaryKey(),
  name: text('name'),
  email: text('email').notNull(),
  message: text('message').notNull(),
  createdAt: timestamp('created_at', { mode: 'date' }).defaultNow(),
  updatedAt: timestamp('updated_at')
})

添加 drizzle 配置文件

在根目录新建drizzle.config.ts

import { defineConfig } from 'drizzle-kit'

export default defineConfig({
  dialect: 'postgresql',
  schema: './src/server/db/schema.ts',
  dbCredentials: {
    host: 'localhost',
    port: 5432,
    user: 'root',
    password: '123456',
    database: 'postgres'
  },
  verbose: true,
  strict: true
})

创建表

运行px drizzle-kit push命令即可

image.png

我们选择yes

image.png

这样就成功了

查看创建的表

运行npx drizzle-kit studio命令,如下图

image.png

点击该地址,手动创建一条数据,如图:

image.png

创建与数据库的连接

src/server/db/db.ts

import { drizzle } from 'drizzle-orm/postgres-js'
import postgres from 'postgres'
import * as schema from './schema'

const queryClient = postgres('postgres://root:123456@0.0.0.0:5432/postgres')
export const db = drizzle(queryClient, {schema})

page.tsx中测试一下


import { db } from '@/server/db/db'

export default async function Home () {
  
  const messages = await db.query.messages.findMany({})
  console.log(messages)

  return (
    <div>hello world</div>
  );
}

然后就会看到:

image.png

结合drizzle-zod进行校验

安装drizzle-zod

pnpm add drizzle-zod

创建src/server/db/validate-schema.ts 内容如下

import { createInsertSchema } from 'drizzle-zod'

import { messages } from './schema'

export const createMessageSchema = createInsertSchema(messages, {
  // 覆盖默认类型
  email: schema=>schema.email.email()
})

在api handler中使用

import { createMessageSchema } from '@/server/db/validate-schema'
import { NextRequest, NextResponse } from 'next/server'

export function GET(request: NextRequest) {
  const query = request.nextUrl.searchParams

  const name = query.get('name')
  const email = query.get('email')
  const message = query.get('message')

  const result = createMessageSchema.safeParse({ name, email, message })

  if (result.success) {
    return NextResponse.json(result.data)
  } else {
    return NextResponse.json(result.error)
  }
}

我们来测试一下

符合校验: image.png

不符合校验:

image.png

总结

本文主要通过 Drizzle ORM 定义数据库模式和表结构,通过 Drizzle 配置连接 PostgreSQL 数据库,并使用 Drizzle-Zod 进行数据校验等。