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
相关产品推荐
相关产品推荐

