You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 00:39:53