Drizzle ORM 使用

发表于 2025/6/16 GMT+8 23:22:45

最后更新于 2025/7/7 GMT+8 23:28:13

Drizzle ORM 是一个 用于数据库的 TypeScript ORM 库

创建数据库

Neon Serverless Postgres,提供免费的 Postgres 云数据库,使用云数据库的一大好处,避免繁复的数据库安装设置,网页上点一点,即可使用。

注册账号后,可以选择数据存放地区,我使用 AWS Asia Pacific 1 (Singapore), Region ID:ap-southeast-1,即 AWS 亚太地区(新加坡)

https://neon.new 还能创建一个临时的 Neon Postgres 云数据库(保留72小时),绑定账号后可以长期保留

临时数据库存放在 AWS Europe Central 1 (Frankfurt), Region ID: eu-central-1

安装依赖

npm i drizzle-orm @neondatabase/serverless
npm i -D drizzle-kit

初始化数据库连接

新建 .env 文件,填入数据库地址(以下地址仅为示例,请填入实际地址)

DATABASE_URL=postgresql://neondb_owner:npg_abcdefghijkl@ep-abcdef-ghijkl-mnopqrst-pooler.ap-southeast-1.aws.neon.tech/neondb?sslmode=require

新建文件 database/drizzle.ts

import { neon } from '@neondatabase/serverless'
import { drizzle } from 'drizzle-orm/neon-http'

if (!process.env.DATABASE_URL) {
  throw new Error('DATABASE_URL environment variable is not set')
}

// Init Neon Client
const sql = neon(process.env.DATABASE_URL)

// Init Drizzle
export const db = drizzle(sql)

定义数据结构

新建文件 database/schema.ts

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

export const chats = pgTable('chats', {
  id: serial('id').primaryKey(),
  userId: text('user_id').notNull(),
  message: text('message').notNull(),
  reply: text('reply').notNull(),
  createAt: timestamp('created_at').defaultNow().notNull(),
})

export const users = pgTable('users', {
  userId: text('user_id').primaryKey(),
  name: text('name').notNull(),
  email: text('email').notNull(),
  createAt: timestamp('created_at').defaultNow().notNull(),
})

// Type inference for Drizzle queries
export type ChatInsert = typeof chats.$inferInsert
export type ChatSelect = typeof chats.$inferSelect

export type userInsert = typeof users.$inferInsert
export type userSelect = typeof users.$inferSelect

配置 drizzle-kit

根目录下新建 drizzle.config.ts

import { defineConfig } from 'drizzle-kit'

export default defineConfig({
  schema: './database/schema.ts',
  // out:'/drizzle'
  dialect: 'postgresql',
  dbCredentials: {
    url: process.env.DATABASE_URL!,
  },
})

生成并执行迁移

将 schema 生成为迁移文件

npx drizzle-kit generate
npx drizzle-kit migrate

此时 neon 数据库中,有了数据表结构。

数据库查询

在需要查询数据的的地方调用

import { db } from 'database/drizzle'
import { users } from 'database/schema'

const user = await db.select().from(users).where(eq(users.userId, userId))