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

Drizzle-ORM findMany查询非空列返回null问题求助

解决Drizzle-ORM查询中自动填充列返回null的问题

1. 检查Drizzle Schema是否包含k_value列

Drizzle基于你定义的Schema生成查询语句,如果Schema里没声明k_value,查询结果自然不会包含这个字段,表现为null。确保你的Schema定义中存在该列:

import { integer, pgTable, real, varchar } from 'drizzle-orm/pg-core';

export const games = pgTable('games', {
  id: integer('id').primaryKey().generatedAlwaysAsIdentity(),
  name: varchar('name').notNull(),
  bgg_weight: real('bgg_weight'),
  k_value: integer('k_value'), // 必须添加这一行定义
});

2. 强制在查询中指定返回k_value列

有时候Drizzle的默认findMany可能不会返回所有列,手动指定columns选项确保该字段被包含:

const games = await db.query.games.findMany({
  columns: {
    id: true,
    name: true,
    bgg_weight: true,
    k_value: true, // 明确指定要返回该列
  },
  orderBy: (model, { desc }) => desc(model.name),
});
console.log(games);

3. 查看Drizzle生成的实际SQL语句

开启Drizzle的日志功能,确认生成的SELECT语句中是否包含k_value:

// 初始化Drizzle时开启日志
import { drizzle } from 'drizzle-orm/postgres-js';
import postgres from 'postgres';

const client = postgres(process.env.DATABASE_URL);
const db = drizzle(client, { logger: true });

运行查询后,控制台会打印执行的SQL,如果SELECT里没有k_value,说明Schema定义有问题,回到第一步修正。

4. 验证触发器的触发范围

确认你的触发器是在INSERT和UPDATE时都触发,避免只有INSERT触发导致更新后数据不一致:

-- 重新创建触发器的示例语句
CREATE TRIGGER set_k_value
BEFORE INSERT OR UPDATE ON games
FOR EACH ROW EXECUTE FUNCTION calculate_k_value();

5. 用原始SQL验证Drizzle连接的数据库

执行原始SQL查询,确认Drizzle连接的数据库中k_value确实有值:

import { sql } from 'drizzle-orm';

const rawResult = await db.execute(sql`SELECT name, k_value FROM games ORDER BY name DESC`);
console.log(rawResult.rows);

如果这个查询返回的k_value正常,说明是Drizzle的查询配置问题;如果也返回null,那要检查数据库连接是否指向正确的环境(比如开发/生产环境搞混)。

内容的提问来源于stack exchange,提问作者Traconis

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 02:48:18