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

Drizzle ORM查询报错:undefined is not an object (evaluating 'relation.referencedTable')

问题

定义了products.ts和category.ts两个Drizzle ORM Schema,二者为一对多关系。执行关联查询await db.query.categories.findMany({with: {products: true}})时抛出错误:undefined is not an object (evaluating 'relation.referencedTable'),期望返回包含关联products的Category数据,类型示例如下:

type CategoryWithProducts = {
    id: string;
    name: string | null;
    createdAt: Date;
    updatedAt: Date | null;
    products: Products[];
}

相关Schema代码

product.ts

import { pgTable, timestamp, uuid, varchar } from "drizzle-orm/pg-core";
import { categories } from "./category";
import { relations } from "drizzle-orm";

export const products = pgTable("products", {
    id: uuid("id").primaryKey().defaultRandom(),
    name: varchar("name", { length: 255 }),
    categoryId: uuid("category_id").notNull().references(() => categories.id),
    createdAt: timestamp("created_at").notNull().defaultNow(),
    updatedAt: timestamp("updated_at").defaultNow(),
    deletedAt: timestamp("deleted_at"),
})

export const productsRelations = relations(products, ({ one }) => ({
    category: one(categories,{
        fields: [products.categoryId],
        references: [categories.id],
    })
}))

export type Product = typeof products.$inferSelect
export type NewProduct = typeof products.$inferInsert

category.ts

import { relations } from "drizzle-orm";
import { pgTable, timestamp, uniqueIndex, uuid, varchar } from "drizzle-orm/pg-core";
import { products } from "./product";

export const categories = pgTable("categories", {
    id: uuid("id").primaryKey().defaultRandom(),
    name: varchar("name", { length: 255 }),
    createdAt: timestamp("created_at").notNull().defaultNow(),
    updatedAt: timestamp("updated_at").defaultNow(),
}, (category) => {
    return {
        nameIndex: uniqueIndex("name_index").on(category.name),
    }
})

export const categoriesRelations = relations(categories, ({ many }) => ({
    products: many(products)
}))

export type Category = typeof categories.$inferSelect
export type NewCategory = typeof categories.$inferInsert

解决方案

1. 显式配置关联关系字段映射

报错根源是循环导入导致Drizzle无法自动解析一对多关系的关联字段。修改category.ts中的categoriesRelations,显式声明关联字段:

export const categoriesRelations = relations(categories, ({ many }) => ({
    products: many(products, {
        fields: [categories.id],
        references: [products.categoryId],
    })
}))

通过明确指定当前表的关联字段(categories.id)和关联表的外键字段(products.categoryId),避免依赖自动解析,解决循环导入带来的初始化问题。

2. 升级Drizzle ORM版本

部分旧版本Drizzle在处理循环导入的关系时存在bug,建议升级到最新稳定版:

npm update drizzle-orm drizzle-kit

3. 确认关系正确注册

创建数据库实例时,确保所有表和关系都被正确导入。示例连接代码:

import { drizzle } from 'drizzle-orm/node-postgres';
import { Pool } from 'pg';
import { products, productsRelations } from './product';
import { categories, categoriesRelations } from './category';

const pool = new Pool({ /* 你的数据库连接配置 */ });
export const db = drizzle(pool, {
    schema: { products, categories, productsRelations, categoriesRelations }
});

完成以上修改后,重新执行查询即可正常返回包含关联products的Category数据,类型将自动匹配预期的CategoryWithProducts结构。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 22:53:12