类型 API
要从你的表架构中检索 select
和 insert
查询的类型,可以使用我们的类型辅助工具。
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>;
import { int, text, mysqlTable } from 'drizzle-orm/mysql-core';
import { type InferSelectModel, type InferInsertModel } from 'drizzle-orm'
const users = mysqlTable('users', {
id: int('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>;
import { int, text, sqliteTable } from 'drizzle-orm/sqlite-core';
import { type InferSelectModel, type InferInsertModel } from 'drizzle-orm'
const users = sqliteTable('users', {
id: int('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>;
import { int, text, singlestoreTable } from 'drizzle-orm/singlestore-core';
import { type InferSelectModel, type InferInsertModel } from 'drizzle-orm'
const users = singlestoreTable('users', {
id: int('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>;
import { int, text, singlestoreTable } from 'drizzle-orm/singlestore-core';
import { type InferSelectModel, type InferInsertModel } from 'drizzle-orm'
const users = singlestoreTable('users', {
id: int('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
SingleStore
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 { int, text, mysqlTableCreator } from 'drizzle-orm/mysql-core';
const mysqlTable = mysqlTableCreator((name) => `project1_${name}`);
const users = mysqlTable('users', {
id: int('id').primaryKey(),
name: text('name').notNull(),
});
import { int, text, sqliteTableCreator } from 'drizzle-orm/sqlite-core';
const sqliteTable = sqliteTableCreator((name) => `project1_${name}`);
const users = sqliteTable('users', {
id: int('id').primaryKey(),
name: text('name').notNull(),
});
import { int, text, singlestoreTableCreator } from 'drizzle-orm/singlestore-core';
const mysqlTable = singlestoreTableCreator((name) => `project1_${name}`);
const users = singlestoreTable('users', {
id: int('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
查询。
const statement = sql`select * from ${users} where ${users.id} = ${userId}`;
const res: postgres.RowList<Record<string, unknown>[]> = await db.execute(statement)
import { ..., MySqlQueryResult } from "drizzle-orm/mysql2";
const statement = sql`select * from ${users} where ${users.id} = ${userId}`;
const res: MySqlRawQueryResult = await db.execute(statement);
const statement = sql`select * from ${users} where ${users.id} = ${userId}`;
const res: unknown[] = db.all(statement)
const res: unknown = db.get(statement)
const res: unknown[][] = db.values(statement)
const res: Database.RunResult = db.run(statement)
import { ..., SingleStoreQueryResult } from "drizzle-orm/singlestore";
const statement = sql`select * from ${users} where ${users.id} = ${userId}`;
const res: SingleStoreRawQueryResult = await db.execute(statement);
独立查询构建器
Drizzle ORM 提供了一个独立的查询构建器,
允许你在不创建数据库实例的情况下构建查询并获取生成的 SQL。
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();
import { QueryBuilder } from 'drizzle-orm/mysql-core';
const qb = new QueryBuilder();
const query = qb.select().from(users).where(eq(users.name, 'Dan'));
const { sql, params } = query.toSQL();
import { QueryBuilder } from 'drizzle-orm/sqlite-core';
const qb = new QueryBuilder();
const query = qb.select().from(users).where(eq(users.name, 'Dan'));
const { sql, params } = query.toSQL();
import { QueryBuilder } from 'drizzle-orm/singlestore-core';
const qb = new QueryBuilder();
const query = qb.select().from(users).where(eq(users.name, 'Dan'));
const { sql, params } = query.toSQL();
获取类型化表字段
你可以获取一个类型化的表字段映射,
当你需要在选择时省略某些字段时非常有用。
import { getTableColumns } from "drizzle-orm";
import { user } from "./schema";
const { password, role, ...rest } = getTableColumns(user);
await db.select({ ...rest }).from(users);
import { serial, text, pgTable } from "drizzle-orm/pg-core";
export const user = pgTable("user", {
id: serial("id").primaryKey(),
name: text("name"),
email: text("email"),
password: text("password"),
role: text("role").$type<"admin" | "customer">(),
});
import { getTableColumns } from "drizzle-orm";
import { user } from "./schema";
const { password, role, ...rest } = getTableColumns(user);
await db.select({ ...rest }).from(users);
import { int, text, mysqlTable } from "drizzle-orm/mysql-core";
export const user = mysqlTable("user", {
id: int("id").primaryKey().autoincrement(),
name: text("name"),
email: text("email"),
password: text("password"),
role: text("role").$type<"admin" | "customer">(),
});
import { getTableColumns } from "drizzle-orm";
import { user } from "./schema";
const { password, role, ...rest } = getTableColumns(user);
await db.select({ ...rest }).from(users);
import { integer, text, sqliteView } from "drizzle-orm/sqlite-core";
export const user = pgTable("user", {
id: integer("id").primaryKey({ autoIncrement: true }),
name: text("name"),
email: text("email"),
password: text("password"),
role: text("role").$type<"admin" | "customer">(),
});
import { getTableColumns } from "drizzle-orm";
import { user } from "./schema";
const { password, role, ...rest } = getTableColumns(user);
await db.select({ ...rest }).from(users);
import { int, text, mysqlTable } from "drizzle-orm/singlestore-core";
export const user = singlestoreTable("user", {
id: int("id").primaryKey().autoincrement(),
name: text("name"),
email: text("email"),
password: text("password"),
role: text("role").$type<"admin" | "customer">(),
});
获取表信息
import { getTableConfig, pgTable } from 'drizzle-orm/pg-core';
export const table = pgTable(...);
const {
columns,
indexes,
foreignKeys,
checks,
primaryKeys,
name,
schema,
} = getTableConfig(table);
import { getTableConfig, mysqlTable } from 'drizzle-orm/mysql-core';
export const table = mysqlTable(...);
const {
columns,
indexes,
foreignKeys,
checks,
primaryKeys,
name,
schema,
} = getTableConfig(table);
import { getTableConfig, sqliteTable } from 'drizzle-orm/sqlite-core';
export const table = sqliteTable(...);
const {
columns,
indexes,
foreignKeys,
checks,
primaryKeys,
name,
schema,
} = getTableConfig(table);
import { getTableConfig, mysqlTable } from 'drizzle-orm/singlestore-core';
export const table = singlestoreTable(...);
const {
columns,
indexes,
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 });