Drizzle ORM
了解如何使用 NuxtHub 设置 Drizzle ORM。
设置
为了增强您与数据库的开发体验,我们可以在几步内创建 useDrizzle()
服务器可组合组件。
安装 Drizzle
- 将
drizzle-orm
包安装到您的项目中
pnpm add drizzle-orm
- 将
drizzle-kit
开发依赖项安装到您的项目中
pnpm add -D drizzle-kit
drizzle.config.ts
在您的项目中添加 drizzle.config.ts
文件
drizzle.config.ts
import { defineConfig } from 'drizzle-kit'
export default defineConfig({
dialect: 'sqlite',
schema: './server/database/schema.ts',
out: './server/database/migrations'
})
数据库模式
server/database/schema.ts
import { sqliteTable, text, integer } from 'drizzle-orm/sqlite-core'
export const users = sqliteTable('users', {
id: integer('id').primaryKey({ autoIncrement: true }),
name: text('name').notNull(),
email: text('email').notNull().unique(),
password: text('password').notNull(),
avatar: text('avatar').notNull(),
createdAt: integer('created_at', { mode: 'timestamp' }).notNull(),
})
npm run db:generate
让我们在 package.json
中添加一个 db:generate
脚本
package.json
{
"scripts": {
"db:generate": "drizzle-kit generate"
}
}
运行 npm run db:generate
命令时,drizzle-kit
将根据 server/database/schema.ts
生成迁移并将其保存到 server/database/migrations
目录中。
迁移
使用 npm run db:generate
创建的迁移会在部署、预览和启动开发服务器时自动应用。
useDrizzle()
最后,我们可以创建一个 useDrizzle()
服务器可组合组件来与数据库交互
server/utils/drizzle.ts
import { drizzle } from 'drizzle-orm/d1'
export { sql, eq, and, or } from 'drizzle-orm'
import * as schema from '../database/schema'
export const tables = schema
export function useDrizzle() {
return drizzle(hubDatabase(), { schema })
}
export type User = typeof schema.users.$inferSelect
我们导出 tables
对象和 useDrizzle
函数,以便在我们的 API 处理程序中使用,而无需导入它们(只要从 server/utils/
文件中导出,Nuxt 就会为我们完成)。
这使您可以方便地引用您的表格并直接与 Drizzle API 交互。
请注意,我们还导出了
User
类型,它是从 users
表推断出来的。这对于对查询结果进行类型检查很有用。我们还从
drizzle-orm
中导出了 sql
、eq
、and
和 or
函数,以便在我们的查询中使用。填充数据库(可选)
您可以添加一个服务器任务来用初始数据填充您的数据库。这使用的是 Nitro 任务,目前这是一个实验性功能。
- 更新您的 nuxt.config.js
nuxt.config.ts
export default defineNuxtConfig({
nitro: {
experimental: {
tasks: true
}
}
})
- 创建一个包含该任务的新文件
server/tasks/seed.ts
export default defineTask({
meta: {
name: 'db:seed',
description: 'Run database seed task'
},
async run() {
console.log('Running DB seed task...')
const users = [
{
name: 'John Doe',
email: '[email protected]',
password: 'password123',
avatar: 'https://example.com/avatar/john.png',
createdAt: new Date()
},
{
name: 'Jane Doe',
email: '[email protected]',
password: 'password123',
avatar: 'https://example.com/avatar/jane.png',
createdAt: new Date()
}
]
await useDrizzle().insert(tables.users).values(users)
return { result: 'success' }
}
})
要运行种子任务,请启动您的开发服务器并打开 Nuxt DevTools。转到任务,您将看到 db:seed
任务已准备好运行。这会将种子数据添加到您的数据库中,并为您提供第一个用户以供使用。
用法
选择
server/api/todos/index.get.ts
export default eventHandler(async () => {
const todos = await useDrizzle().select().from(tables.todos).all()
return todos
})
插入
server/api/todos/index.post.ts
export default eventHandler(async (event) => {
const { title } = await readBody(event)
const todo = await useDrizzle().insert(tables.todos).values({
title,
createdAt: new Date()
}).returning().get()
return todo
})
更新
server/api/todos/[id].patch.ts
export default eventHandler(async (event) => {
const { id } = getRouterParams(event)
const { completed } = await readBody(event)
const todo = await useDrizzle().update(tables.todos).set({
completed
}).where(eq(tables.todos.id, Number(id))).returning().get()
return todo
})
删除
server/api/todos/[id].delete.ts
export default eventHandler(async (event) => {
const { id } = getRouterParams(event)
const deletedTodo = await useDrizzle().delete(tables.todos).where(and(
eq(tables.todos.id, Number(id))
)).returning().get()
if (!deletedTodo) {
throw createError({
statusCode: 404,
message: 'Todo not found'
})
}
return deletedTodo
})