如何使用Drizzle ORM默认排除SELECT语句中的指定敏感字段?
在Drizzle ORM中默认排除用户模型的敏感字段(如password)
方案1:创建数据库视图
直接在数据库层面创建不含敏感字段的用户视图,所有查询基于视图进行,从根源上避免返回password字段。
代码示例
import { pgTable, text, varchar } from 'drizzle-orm/pg-core'; import { db } from './db'; // 定义原始用户表(包含敏感字段password) export const users = pgTable('users', { id: varchar('id').primaryKey(), username: text('username').unique().notNull(), email: text('email').unique().notNull(), password: text('password').notNull(), createdAt: text('created_at').notNull(), }); // 创建排除password的用户视图 export const userView = pgTable('user_view', { id: varchar('id').primaryKey(), username: text('username').unique().notNull(), email: text('email').unique().notNull(), createdAt: text('created_at').notNull(), }).$createView(() => { return db.select({ id: users.id, username: users.username, email: users.email, createdAt: users.createdAt, }).from(users); }); // 查询视图,自动排除password const safeUsers = await db.select().from(userView);
方案2:封装自定义查询函数
封装统一的查询工具函数,强制在查询时排除password,团队成员只需调用这些函数,无需手动指定字段。
代码示例
import { db } from './db'; import { users } from './schema'; import { eq } from 'drizzle-orm'; import { type InferSelectModel } from 'drizzle-orm'; // 定义不含password的用户类型 type SafeUser = Omit<InferSelectModel<typeof users>, 'password'>; // 查询所有用户(自动排除password) export async function getUsers(): Promise<SafeUser[]> { return db.select({ id: users.id, username: users.username, email: users.email, createdAt: users.createdAt, }).from(users); } // 根据ID查询单个用户(自动排除password) export async function getUserById(id: string): Promise<SafeUser | undefined> { const result = await db.select({ id: users.id, username: users.username, email: users.email, createdAt: users.createdAt, }).from(users).where(eq(users.id, id)).limit(1); return result[0]; } // 使用示例 const users = await getUsers(); const user = await getUserById('123');
方案3:利用Drizzle类型工具实现类型安全投影
通过Drizzle内置的$exclude类型工具,快速生成排除指定字段的投影配置,同时保证类型安全。
代码示例
import { db } from './db'; import { users } from './schema'; import { eq } from 'drizzle-orm'; import { type $exclude } from 'drizzle-orm'; // 生成排除password的投影配置 const safeUserProjection = $exclude(users, ['password']); // 查询时直接使用该投影 const safeUsers = await db.select(safeUserProjection).from(users); // 单个用户查询 const safeUser = await db.select(safeUserProjection).from(users).where(eq(users.id, '123')).limit(1);
方案对比
- 数据库视图:适合所有查询需统一字段集合的场景,性能最优,但灵活性差,临时需要
password需单独查询原表。 - 自定义查询函数:灵活性高,可封装不同场景逻辑,同时规范团队用法,适合大多数项目。
- Drizzle类型工具:适合快速生成投影且注重类型安全的场景,代码简洁,需团队熟悉Drizzle类型系统。
内容的提问来源于stack exchange,提问作者hantoren
相关产品推荐
相关产品推荐

