Drizzle: undefined (reading 'compositePrimaryKeys') fehler
Sie haben Ihr Projekt mit Drizzle gestartet und wollten den Tabellennamen mit drizzle-kit ändern, aber anstatt den Tabellennamen erfolgreich zu aktualisieren, erhielten Sie TypeError: Cannot read properties of undefined (Lesen von 'compositePrimaryKeys')?
Lassen Sie mich Ihnen erklären, warum dieser Fehler auftritt und wie er behoben werden kann.
Wie Sie wahrscheinlich wissen (oder auch nicht), ist Drizzle-kit in der Beta-Version und dieses spezielle Problem ist in Drizzle-kit sehr bekannt, aber leider seit 2023 nicht behoben. Dieser TypeError tritt auf, wenn Sie eine Tabelle mit FK (Fremdschlüssel) haben, also zum Beispiel eine Tabelle namens session:
export const sessions = createTable( "session", { sessionToken: varchar("sessionToken", { length: 255 }) .notNull() .primaryKey(), userId: varchar("userId", { length: 255 }).notNull(), expires: timestamp("expires", { mode: "date" }).notNull(), }, (session) => ({ userIdIdx: index("session_userId_idx").on(session.userId), }),);
Wie Sie sehen können, haben wir eine Verbindung zwischen der Sitzungstabelle und der Benutzertabelle.
Wenn Sie nun die Sitzungstabelle z.B. in => Sitzungen umbenennen wollen, erhalten Sie einen 'compositePrimaryKeys' TypeError, der zu Datenverlust führt (die gesamte Tabelle wird gelöscht). Das wollen Sie nicht tun.
Ich habe eine Lösung gefunden, die ziemlich gut funktioniert. Wenn Sie also diesen Fehler erhalten und z.B. die Tabelle umbenennen wollen, müssen Sie dies manuell über MySQL tun (ich verwende MySQL als Datenbank, aber es funktioniert auch in jeder anderen Sprache). Wenn Sie Ihre Datenbank bei einem externen Anbieter wie PlanetScale hosten, dann können Sie MySQL-Skripte direkt über die Benutzeroberfläche ausführen (wenn Sie lokal hosten, können Sie PHP Admin oder etwas anderes verwenden). Die Skripte sind bekannt, daher sollte es nicht so schwer sein, aber Sie müssen vorsichtig sein, weil Sie Ihre Datenbank zerstören können, deshalb empfehle ich, vorher ein Datenbank-Backup zu machen.
In meinem Anwendungsfall wollte ich meine Tabelle umbenennen, also führe ich aus: RENAME TABLE old_table TO new_table
Danach wurde die Tabelle erfolgreich umbenannt, und ich habe nichts in der Datenbank und im Drizzle-Schema kaputt gemacht.
Wie ich schon sagte, ist dieser Fehler in Drizzle-kit in der Community bekannt und man kann den Fortschritt in diesem GitHub Thread verfolgen: https://github.com/drizzle-team/drizzle-orm/issues/1144
Ich hoffe, ich konnte Ihnen damit helfen. Wenn Sie Fragen haben, können Sie gerne kommentieren oder mich kontaktieren.
About the author
Penify creator, Fullstack developer, Typescript, Web, Apps, Blogger
I am an experienced Fullstack web developer and the creator of Penify blog platform. I am excited and motivated to explore new technologies. I am a dedicated and hardworking person with a will to create the best user experience.