本文所用相关包的版本
- 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
命令即可
我们选择yes
这样就成功了
查看创建的表
运行npx drizzle-kit studio
命令,如下图
点击该地址,手动创建一条数据,如图:
创建与数据库的连接
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>
);
}
然后就会看到:
结合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)
}
}
我们来测试一下
符合校验:
不符合校验:
总结
本文主要通过 Drizzle ORM 定义数据库模式和表结构,通过 Drizzle 配置连接 PostgreSQL 数据库,并使用 Drizzle-Zod 进行数据校验等。