Become a Gold Sponsor

类型 API

要从你的表架构中检索 selectinsert 查询的类型,可以使用我们的类型辅助工具。

PostgreSQL
MySQL
SQLite
import { serial, text, pgTable } from 'drizzle-orm/pg-core';
import { type InferSelectModel, type InferInsertModel } from 'drizzle-orm'

const users = pgTable('users', {
  id: serial('id').primaryKey(),
  name: text('name').notNull(),
});

type SelectUser = typeof users.$inferSelect;
type InsertUser = typeof users.$inferInsert;
// 或
type SelectUser = typeof users._.$inferSelect;
type InsertUser = typeof users._.$inferInsert;
// 或
type SelectUser = InferSelectModel<typeof users>;
type InsertUser = InferInsertModel<typeof users>;

日志记录

要启用默认的查询日志记录,只需将 { logger: true } 传递给 drizzle 初始化函数:

import { drizzle } from 'drizzle-orm/...'; // 驱动特定的

const db = drizzle({ logger: true });

你可以通过创建一个 DefaultLogger 实例并提供自定义的 writer 来更改日志的目的地:

import { DefaultLogger, LogWriter } from 'drizzle-orm/logger';
import { drizzle } from 'drizzle-orm/...'; // 驱动特定的

class MyLogWriter implements LogWriter {
  write(message: string) {
    // 写入文件、标准输出等。
  }
}

const logger = new DefaultLogger({ writer: new MyLogWriter() });
const db = drizzle({ logger });

你还可以创建一个自定义的日志记录器:

import { Logger } from 'drizzle-orm/logger';
import { drizzle } from 'drizzle-orm/...'; // 驱动特定的

class MyLogger implements Logger {
  logQuery(query: string, params: unknown[]): void {
    console.log({ query, params });
  }
}

const db = drizzle({ logger: new MyLogger() });

多项目架构

表创建者 API 让你定义自定义表名。
当你需要将不同项目的架构保存在同一个数据库中时,它非常有用。

PostgreSQL
MySQL
SQLite
import { serial, text, pgTableCreator } from 'drizzle-orm/pg-core';

const pgTable = pgTableCreator((name) => `project1_${name}`);

const users = pgTable('users', {
  id: serial('id').primaryKey(),
  name: text('name').notNull(),
});
import { defineConfig } from "drizzle-kit";

export default defineConfig({
  schema: "./src/schema/*",
  out: "./drizzle",
  dialect: "mysql", 
  dbCredentials: {
    url: process.env.DATABASE_URL,
  }
  tablesFilter: ["project1_*"],
});

你可以应用多个 or 过滤器:

tablesFilter: ["project1_*", "project2_*"]

打印 SQL 查询

你可以通过 db 实例或使用 独立查询构建器 打印 SQL 查询。

const query = db
  .select({ id: users.id, name: users.name })
  .from(users)
  .groupBy(users.id)
  .toSQL();
// 查询:
{
  sql: 'select 'id', 'name' from 'users' group by 'users'.'id'',
  params: [],
}

原始 SQL 查询执行

如果你有一些复杂的查询需要执行,而 drizzle-orm 目前无法处理, 你可以使用 db.execute 方法执行原始的 parametrized 查询。

PostgreSQL
MySQL
SQLite
const statement = sql`select * from ${users} where ${users.id} = ${userId}`;
const res: postgres.RowList<Record<string, unknown>[]> = await db.execute(statement)

独立查询构建器

Drizzle ORM 提供了一个独立的查询构建器, 允许你在不创建数据库实例的情况下构建查询并获取生成的 SQL。

PostgreSQL
MySQL
SQLite
import { QueryBuilder } from 'drizzle-orm/pg-core';

const qb = new QueryBuilder();

const query = qb.select().from(users).where(eq(users.name, 'Dan'));
const { sql, params } = query.toSQL();

获取类型化表字段

你可以获取一个类型化的表字段映射, 当你需要在选择时省略某些字段时非常有用。

PostgreSQL
MySQL
SQLite
index.ts
schema.ts
import { getTableColumns } from "drizzle-orm";
import { user } from "./schema";

const { password, role, ...rest } = getTableColumns(user);

await db.select({ ...rest }).from(users);

获取表信息

PostgreSQL
MySQL
SQLite
import { getTableConfig, pgTable } from 'drizzle-orm/pg-core';

export const table = pgTable(...);

const {
  columns,
  indexes,
  foreignKeys,
  checks,
  primaryKeys,
  name,
  schema,
} = getTableConfig(table);

比较对象类型(instanceof 的替代方案)

你可以使用 is() 函数检查一个对象是否为特定的 Drizzle 类型。 你可以与 Drizzle 中的任何可用类型一起使用。

IMPORTANT

你应该始终使用 is() 而不是 instanceof

几个例子

import { Column, is } from 'drizzle-orm';

if (is(value, Column)) {
  // value 的类型被缩小为 Column
}

模拟驱动程序

该 API 是一个继承于未定义的 drizzle({} as any) API 的后续版本,我们在 Drizzle 测试中内部使用过,并很少推荐给外部开发者。

我们决定构建并公开一个适当的 API,现在每个 drizzle 驱动程序都有 drizzle.mock()

import { drizzle } from "drizzle-orm/node-postgres";

const db = drizzle.mock();

如果需要,您可以提供类型的架构。

import { drizzle } from "drizzle-orm/node-postgres";
import * as schema from "./schema"

const db = drizzle.mock({ schema });