Drizzle 创建关系查询和未定义的“referencedTable”错误

问题描述 投票:0回答:1

我在使用 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 };
next.js orm drizzle
1个回答
0
投票

找出问题所在,发现 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 });
© www.soinside.com 2019 - 2024. All rights reserved.