我在使用 NextJs 时正在学习毛毛雨,但我无法找出包含关系的查询的问题。问题是:
创建数据库连接时如下
import { config } from "dotenv";
import { drizzle } from "drizzle-orm/postgres-js";
import postgres from "postgres";
import { notes, files } from "../../drizzle/schema";
config({ path: ".env" });
const connection = postgres({
host: process.env.PG_HOST ?? "localhost",
port: Number(process.env.PG_PORT) ?? 5432,
user: process.env.PG_USER ?? "postgres",
password: process.env.PG_PASSWORD ?? "",
database: process.env.PG_DATABASE ?? "postgres",
});
const db = drizzle(connection, {
schema: { notes, files },
logger: true,
});
export default db;
这会出现以下错误:“错误:无法读取未定义的属性(读取'referencedTable')”
我可以用以下代码解决这个问题:
import { config } from "dotenv";
import { drizzle } from "drizzle-orm/postgres-js";
import postgres from "postgres";
import { notes, files } from "../../drizzle/schema";
config({ path: ".env" });
const connection = postgres({
host: process.env.PG_HOST ?? "localhost",
port: Number(process.env.PG_PORT) ?? 5432,
user: process.env.PG_USER ?? "postgres",
password: process.env.PG_PASSWORD ?? "",
database: process.env.PG_DATABASE ?? "postgres",
});
const db = drizzle(connection, {
schema: { ...notes, ...files },
logger: true,
});
export default db;
这两个代码之间的区别是行模式:{},在第一个代码中我用作模式:{notes,files},它给出了第一个错误,并将其用作模式:{...notes,... files } 可以解决这个问题。
以下代码给出错误“错误:无法读取未定义的属性(读取'findMany')”,因为
db.query
是一个空对象。
export async function fetchNotes() {
return await db.query.notes.findMany({
with: {
files: true
}
})
}
实际的问题是,当我想使用 db.query 以便可以通过关系进行选择时,如果我尝试使用 schema: { ...notes, ...files } 行解决第一个问题,db.query 对象将变为空{}(对象)。
我阅读了我发现的所有内容,但仍然无法找出问题所在。
以下片段是与毛毛雨相关的文件:
文件:drizzle.config.ts
import "dotenv/config";
import { defineConfig } from "drizzle-kit";
export default defineConfig({
dialect: "postgresql",
out: "./drizzle",
schema: "./drizzle/schema.ts",
dbCredentials: {
host: process.env.PG_HOST ?? "localhost",
port: Number(process.env.PG_PORT) ?? 5432,
user: process.env.PG_USER ?? "postgres",
password: process.env.PG_PASSWORD ?? "",
database: process.env.PG_DATABASE ?? "postgres",
},
verbose: true,
strict: true,
});
文件:drizzle/schema.ts
import { relations } from "drizzle-orm";
import { text, serial, pgTable, integer } from "drizzle-orm/pg-core";
export const notes = pgTable("notes", {
id: serial("notes_id").primaryKey(),
title: text("notes_title").unique().notNull(),
description: text("notes_description").notNull(),
});
export type NoteWithFiles = SelectNotes & { files: SelectFiles[] };
export type SelectNotes = typeof notes.$inferSelect;
export type InsertNotes = typeof notes.$inferInsert;
export const files = pgTable("files", {
id: serial("files_id").primaryKey(),
title: text("files_title").notNull(),
language: text("files_language").notNull(),
body: text("files_content_body").notNull(),
noteId: integer("note_id").references(() => notes.id, {
onDelete: "cascade",
}).notNull(),
});
export const notesRelations = relations(notes, ({ many }) => ({
files: many(files),
}));
export const filesRelations = relations(files, ({ one }) => ({
note: one(notes, {
fields: [files.noteId],
references: [notes.id],
}),
}));
export type FileWithNote = SelectFiles & { note: SelectNotes };
export type SelectFiles = typeof files.$inferSelect;
export type InsertFiles = typeof files.$inferInsert;
export const schema = { notes, files };
找出问题所在,发现 drizzle 文档可能会误导此代码块将 drizzle 数据库连接显示为
const db = drizzle(client, { schema: { ...schema1, ...schema2 } });
,这是错误的,您需要将文件导入为模式并将其用作 drizzle 函数的参数。
错误示例
const db = drizzle(client, { schema: { ...schema1, ...schema2 } });
更正版本
import * as schema from "path/to/schema";
const db = drizzle(connection, { schema });