Drizzle ORM

了解如何使用 NuxtHub 设置 Drizzle ORM。
了解更多关于 Drizzle ORM 的信息。

设置

为了增强您与数据库的开发体验,我们可以在几步内创建 useDrizzle() 服务器可组合组件。

安装 Drizzle

  1. drizzle-orm 包安装到您的项目中
pnpm add drizzle-orm
  1. 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 中导出了 sqleqandor 函数,以便在我们的查询中使用。

填充数据库(可选)

您可以添加一个服务器任务来用初始数据填充您的数据库。这使用的是 Nitro 任务,目前这是一个实验性功能。

  1. 更新您的 nuxt.config.js
nuxt.config.ts
export default defineNuxtConfig({
  nitro: {
    experimental: {
      tasks: true
    }
  }
})
  1. 创建一个包含该任务的新文件
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
})