The Error ->
<code> ⨯ PostgresError: insert or update on table "godly-test_characters" violates foreign key constraint "godly-test_characters_anime_id_godly-test_anime_id_fk"
at ErrorResponse (P:godly-test.nextserverchunksssrnode_modules_postgres_src_b9a524._.js:1255:171)
at handle (P:godly-test.nextserverchunksssrnode_modules_postgres_src_b9a524._.js:1055:728)
at Socket.data (P:godly-test.nextserverchunksssrnode_modules_postgres_src_b9a524._.js:943:17)
at Socket.emit (node:events:519:28)
digest: "1545992261"
</code>
<code> ⨯ PostgresError: insert or update on table "godly-test_characters" violates foreign key constraint "godly-test_characters_anime_id_godly-test_anime_id_fk"
at ErrorResponse (P:godly-test.nextserverchunksssrnode_modules_postgres_src_b9a524._.js:1255:171)
at handle (P:godly-test.nextserverchunksssrnode_modules_postgres_src_b9a524._.js:1055:728)
at Socket.data (P:godly-test.nextserverchunksssrnode_modules_postgres_src_b9a524._.js:943:17)
at Socket.emit (node:events:519:28)
digest: "1545992261"
</code>
⨯ PostgresError: insert or update on table "godly-test_characters" violates foreign key constraint "godly-test_characters_anime_id_godly-test_anime_id_fk"
at ErrorResponse (P:godly-test.nextserverchunksssrnode_modules_postgres_src_b9a524._.js:1255:171)
at handle (P:godly-test.nextserverchunksssrnode_modules_postgres_src_b9a524._.js:1055:728)
at Socket.data (P:godly-test.nextserverchunksssrnode_modules_postgres_src_b9a524._.js:943:17)
at Socket.emit (node:events:519:28)
digest: "1545992261"
I am trying to insert actors and characters into database like this
<code>async function fetchAnimeInfo(animeId: number) {
const animeStringId = animeId.toString();
const getAnime = await db.query.animeTable.findFirst({
where: (animeTable, { eq }) => eq(animeTable.id, animeId),
with: {
characters: {
with: {
voicedActor: true,
},
},
},
});
if (!getAnime) {
const animeInfo = await anilist.fetchAnilistInfoById(animeStringId);
const characters = animeInfo.characters as AnimeCharacter[];
const chars = await Promise.all(
characters.map(async (char) => {
const charName = typeof char.name === "string" ? char.name : char.name.full;
const actor = char.voiceActors.filter(
(act) => act.language?.toLocaleUpperCase() === "JAPANESE",
)?.[0];
if (actor) {
const actorName = typeof actor.name === "string" ? actor.name : actor.name.full;
const [actorId] = await db
.insert(actorsTable)
.values({
id: actor.id,
name: actorName,
voiceCharacter: char.id,
})
.returning({ id: actorsTable.id });
const [charId] = await db
.insert(charactersTable)
.values({
id: char.id,
name: charName,
anime: animeId,
voicedActor: actorId?.id,
})
.returning({ id: charactersTable.id });
return charId?.id;
}
return null;
}),
);
const newChars = chars.filter(
(char) => typeof char !== "undefined" && char !== null,
);
if (newChars.length > 0) {
// const anime = await db.insert({ animeTable }).values....
}
return animeInfo;
}
}
}
</code>
<code>async function fetchAnimeInfo(animeId: number) {
const animeStringId = animeId.toString();
const getAnime = await db.query.animeTable.findFirst({
where: (animeTable, { eq }) => eq(animeTable.id, animeId),
with: {
characters: {
with: {
voicedActor: true,
},
},
},
});
if (!getAnime) {
const animeInfo = await anilist.fetchAnilistInfoById(animeStringId);
const characters = animeInfo.characters as AnimeCharacter[];
const chars = await Promise.all(
characters.map(async (char) => {
const charName = typeof char.name === "string" ? char.name : char.name.full;
const actor = char.voiceActors.filter(
(act) => act.language?.toLocaleUpperCase() === "JAPANESE",
)?.[0];
if (actor) {
const actorName = typeof actor.name === "string" ? actor.name : actor.name.full;
const [actorId] = await db
.insert(actorsTable)
.values({
id: actor.id,
name: actorName,
voiceCharacter: char.id,
})
.returning({ id: actorsTable.id });
const [charId] = await db
.insert(charactersTable)
.values({
id: char.id,
name: charName,
anime: animeId,
voicedActor: actorId?.id,
})
.returning({ id: charactersTable.id });
return charId?.id;
}
return null;
}),
);
const newChars = chars.filter(
(char) => typeof char !== "undefined" && char !== null,
);
if (newChars.length > 0) {
// const anime = await db.insert({ animeTable }).values....
}
return animeInfo;
}
}
}
</code>
async function fetchAnimeInfo(animeId: number) {
const animeStringId = animeId.toString();
const getAnime = await db.query.animeTable.findFirst({
where: (animeTable, { eq }) => eq(animeTable.id, animeId),
with: {
characters: {
with: {
voicedActor: true,
},
},
},
});
if (!getAnime) {
const animeInfo = await anilist.fetchAnilistInfoById(animeStringId);
const characters = animeInfo.characters as AnimeCharacter[];
const chars = await Promise.all(
characters.map(async (char) => {
const charName = typeof char.name === "string" ? char.name : char.name.full;
const actor = char.voiceActors.filter(
(act) => act.language?.toLocaleUpperCase() === "JAPANESE",
)?.[0];
if (actor) {
const actorName = typeof actor.name === "string" ? actor.name : actor.name.full;
const [actorId] = await db
.insert(actorsTable)
.values({
id: actor.id,
name: actorName,
voiceCharacter: char.id,
})
.returning({ id: actorsTable.id });
const [charId] = await db
.insert(charactersTable)
.values({
id: char.id,
name: charName,
anime: animeId,
voicedActor: actorId?.id,
})
.returning({ id: charactersTable.id });
return charId?.id;
}
return null;
}),
);
const newChars = chars.filter(
(char) => typeof char !== "undefined" && char !== null,
);
if (newChars.length > 0) {
// const anime = await db.insert({ animeTable }).values....
}
return animeInfo;
}
}
}
I am fetching data from anilist and it gives me data like this
<code>[
{
id: number;
characters: {
id: number;
role?: string;
name: {
first: string;
last: string;
full: string;
native?: string;
userPreferred?: string;
};
image?: string;
voiceActors: {
id: number;
language?: string;
name: {
first: string;
last: string;
full: string;
native?: string;
userPreferred?: string;
};
image?: string;
};
}
...
}
]
</code>
<code>[
{
id: number;
characters: {
id: number;
role?: string;
name: {
first: string;
last: string;
full: string;
native?: string;
userPreferred?: string;
};
image?: string;
voiceActors: {
id: number;
language?: string;
name: {
first: string;
last: string;
full: string;
native?: string;
userPreferred?: string;
};
image?: string;
};
}
...
}
]
</code>
[
{
id: number;
characters: {
id: number;
role?: string;
name: {
first: string;
last: string;
full: string;
native?: string;
userPreferred?: string;
};
image?: string;
voiceActors: {
id: number;
language?: string;
name: {
first: string;
last: string;
full: string;
native?: string;
userPreferred?: string;
};
image?: string;
};
}
...
}
]
The schemas are
<code>// actors.ts
import { integer, text } from "drizzle-orm/pg-core";
import createTable from "./createTable";
import { relations } from "drizzle-orm";
import { animeTable } from "./anime";
import { charactersTable } from "./characters";
export const actorsTable = createTable("actors", {
id: integer("id").primaryKey().unique(),
name: text("name"),
voiceCharacter: integer("voice_character"),
});
export const actorsRelations = relations(actorsTable, ({ one, many }) => ({
voiceCharacter: one(charactersTable, {
fields: [actorsTable.voiceCharacter],
references: [charactersTable.id],
}),
anime: many(animeTable),
}));
</code>
<code>// actors.ts
import { integer, text } from "drizzle-orm/pg-core";
import createTable from "./createTable";
import { relations } from "drizzle-orm";
import { animeTable } from "./anime";
import { charactersTable } from "./characters";
export const actorsTable = createTable("actors", {
id: integer("id").primaryKey().unique(),
name: text("name"),
voiceCharacter: integer("voice_character"),
});
export const actorsRelations = relations(actorsTable, ({ one, many }) => ({
voiceCharacter: one(charactersTable, {
fields: [actorsTable.voiceCharacter],
references: [charactersTable.id],
}),
anime: many(animeTable),
}));
</code>
// actors.ts
import { integer, text } from "drizzle-orm/pg-core";
import createTable from "./createTable";
import { relations } from "drizzle-orm";
import { animeTable } from "./anime";
import { charactersTable } from "./characters";
export const actorsTable = createTable("actors", {
id: integer("id").primaryKey().unique(),
name: text("name"),
voiceCharacter: integer("voice_character"),
});
export const actorsRelations = relations(actorsTable, ({ one, many }) => ({
voiceCharacter: one(charactersTable, {
fields: [actorsTable.voiceCharacter],
references: [charactersTable.id],
}),
anime: many(animeTable),
}));
<code>// characters.ts
import { integer, text } from "drizzle-orm/pg-core";
import createTable from "./createTable";
import { relations } from "drizzle-orm";
import { actorsTable } from "./actors";
import { animeTable } from "./anime";
export const charactersTable = createTable("characters", {
id: integer("id").primaryKey().unique(),
name: text("name"),
voicedActor: integer("voiced_actor").references(() => actorsTable.id),
anime: integer("anime_id"),
});
export const charactersRelations = relations(
charactersTable,
({ one, many }) => ({
anime: one(animeTable, {
fields: [charactersTable.anime],
references: [animeTable.id],
}),
voicedActor: many(actorsTable),
}),
);
</code>
<code>// characters.ts
import { integer, text } from "drizzle-orm/pg-core";
import createTable from "./createTable";
import { relations } from "drizzle-orm";
import { actorsTable } from "./actors";
import { animeTable } from "./anime";
export const charactersTable = createTable("characters", {
id: integer("id").primaryKey().unique(),
name: text("name"),
voicedActor: integer("voiced_actor").references(() => actorsTable.id),
anime: integer("anime_id"),
});
export const charactersRelations = relations(
charactersTable,
({ one, many }) => ({
anime: one(animeTable, {
fields: [charactersTable.anime],
references: [animeTable.id],
}),
voicedActor: many(actorsTable),
}),
);
</code>
// characters.ts
import { integer, text } from "drizzle-orm/pg-core";
import createTable from "./createTable";
import { relations } from "drizzle-orm";
import { actorsTable } from "./actors";
import { animeTable } from "./anime";
export const charactersTable = createTable("characters", {
id: integer("id").primaryKey().unique(),
name: text("name"),
voicedActor: integer("voiced_actor").references(() => actorsTable.id),
anime: integer("anime_id"),
});
export const charactersRelations = relations(
charactersTable,
({ one, many }) => ({
anime: one(animeTable, {
fields: [charactersTable.anime],
references: [animeTable.id],
}),
voicedActor: many(actorsTable),
}),
);
<code>// anime.ts
import { integer, text } from "drizzle-orm/pg-core";
import createTable from "./createTable";
import { relations } from "drizzle-orm";
import { charactersTable } from "./characters";
export const animeTable = createTable("anime", {
id: integer("id").primaryKey().unique(),
title: text("title"),
characters: integer("characters_id").references(() => charactersTable.id),
});
export const animeRelations = relations(animeTable, ({ many }) => ({
characters: many(charactersTable),
}));
</code>
<code>// anime.ts
import { integer, text } from "drizzle-orm/pg-core";
import createTable from "./createTable";
import { relations } from "drizzle-orm";
import { charactersTable } from "./characters";
export const animeTable = createTable("anime", {
id: integer("id").primaryKey().unique(),
title: text("title"),
characters: integer("characters_id").references(() => charactersTable.id),
});
export const animeRelations = relations(animeTable, ({ many }) => ({
characters: many(charactersTable),
}));
</code>
// anime.ts
import { integer, text } from "drizzle-orm/pg-core";
import createTable from "./createTable";
import { relations } from "drizzle-orm";
import { charactersTable } from "./characters";
export const animeTable = createTable("anime", {
id: integer("id").primaryKey().unique(),
title: text("title"),
characters: integer("characters_id").references(() => charactersTable.id),
});
export const animeRelations = relations(animeTable, ({ many }) => ({
characters: many(charactersTable),
}));
I tried Following official docs can’t find anything useful.
There is no type error.
Everything seems to be ok but it doesn’t work.
Don’t Know What I am doing wrong. Please Help!