调试Drizzle SQL查询时遇undefined (reading 'referencedTable')错误
Drizzle ORM调试:获取原生SQL及解决'referencedTable'未定义错误
一、获取查询执行前的原生SQL
有两种实用方式可以拿到Drizzle生成的原生SQL:
1. 手动预编译查询提取SQL
对构建好的查询调用prepare()方法,直接获取生成的SQL语句和参数:
// 先构建你的查询 const query = db.query.contract_opgc.findMany({ columns: { contract_id: true, // 其他字段... }, extras: { totalCount: sql<number>`COUNT(*) OVER()`.as('totalCount'), }, where: (contract, { eq, and }) => and(eq(contract.country_code, countryCode)), with: { item: { columns: { item_type_code: true, }, }, }, }); // 提取SQL和参数 const { sql, params } = query.prepare(); console.log('原生SQL:', sql); console.log('参数:', params);
2. 开启内置日志自动打印
初始化数据库连接时开启logger选项,Drizzle会自动输出所有执行的SQL和参数:
// 以PostgreSQL为例,其他数据库配置逻辑一致 import { drizzle } from 'drizzle-orm/node-postgres'; import { Client } from 'pg'; const client = new Client({ host: '你的数据库地址', port: 5432, user: '用户名', password: '密码', database: '数据库名', }); await client.connect(); // 开启日志 const db = drizzle(client, { logger: true });
二、分析'referencedTable'未定义错误
从你提供的关联关系代码看,问题大概率出在关系定义的方向或表名匹配上:
- 关系定义主体错误
你当前的contractRelations是基于item表定义的,但查询是从contract_opgc表关联item。如果是contract表关联item,应该在contract表的relations里定义item关联,正确写法示例:
// 确保contract_opgc是你的contract表变量 export const contractRelations = relations(contract_opgc, ({ one }) => ({ item: one(item, { fields: [contract_opgc.item_gid, contract_opgc.country_code], references: [item.item_gid, item.item_country_code], }), }));
表变量名不匹配
查询中使用的是contract_opgc,但关系里用的是contract变量,确认两者是否指向同一个数据库表。如果表实际命名为contract_opgc,但变量名是contract,会导致Drizzle找不到关联表。关联字段校验
检查fields和references中的字段是否存在、类型是否完全一致(比如都是字符串/数字,长度匹配等),字段不匹配也会触发此类错误。
内容的提问来源于stack exchange,提问作者MarJano
相关产品推荐
相关产品推荐

