Drizzle: undefined (reading 'compositePrimaryKeys') problem
Rozpocząłeś swój projekt z Drizzle, a następnie chciałeś zmienić nazwę tabeli za pomocą drizzle-kit, ale zamiast pomyślnie zaktualizować nazwę tabeli, otrzymałeś TypeError: Nie można odczytać właściwości undefined (odczyt "compositePrimaryKeys")?
Pozwól, że wyjaśnię Ci, dlaczego ten błąd występuje wraz z potencjalną poprawką.
Jak zapewne wiesz (lub nie), Drizzle-kit jest w wersji beta i ten konkretny problem jest bardzo dobrze znany w Drizzle-kit, ale niestety nie został naprawiony od 2023 roku. Ten TypeError występuje, gdy masz tabelę z FK (Foreign Keys), więc na przykład mamy tabelę o nazwie 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), }),);
Jak widać, mamy połączenie między tabelą sesji a tabelą użytkowników.
Teraz, jeśli chcesz zmienić nazwę tabeli sesji na przykład => Sesje, otrzymasz błąd typu "compositePrimaryKeys", który prowadzi do utraty danych (upuszczenie całej tabeli). Nie chcesz tego robić.
Natknąłem się na rozwiązanie, które działa całkiem dobrze. Jeśli więc otrzymujesz ten błąd i chcesz na przykład zmienić nazwę tabeli, musisz to zrobić ręcznie za pośrednictwem MySQL (używam MySQL jako db, ale będzie działać w każdym innym języku). Jeśli hostujesz swoją bazę danych u zewnętrznych dostawców, takich jak PlanetScale, możesz bezpośrednio wykonywać skrypty MySQL za pośrednictwem interfejsu użytkownika (jeśli hostujesz lokalnie, możesz użyć PHP Admin lub czegoś innego). Skrypty są dobrze znane, więc nie powinno to być trudne, ale musisz być ostrożny, ponieważ możesz uszkodzić swoją bazę danych, dlatego zalecam wykonanie kopii zapasowej bazy danych przed wykonaniem tej czynności.
W moim przypadku chciałem zmienić nazwę tabeli, więc wykonałem polecenie: RENAME TABLE old_table TO new_table
Następnie nazwa tabeli została pomyślnie zmieniona, a ja nie zepsułem niczego w bazie danych i schemacie Drizzle.
Jak już wspomniałem, ten błąd w Drizzle-kit jest znany w społeczności i można śledzić postępy w tym wątku GitHub: https://github.com/drizzle-team/drizzle-orm/issues/1144.
Mam nadzieję, że udało mi się pomóc. Jeśli masz jakieś pytania, skontaktuj się ze mną lub skomentuj.
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.