Drizzle : erreur non définie (lecture de 'compositePrimaryKeys')
Programming
3/10/2024
3 minutes
Author: Dawid

Available languages:

Drizzle : erreur non définie (lecture de 'compositePrimaryKeys')

Vous avez démarré votre projet avec Drizzle, puis vous avez voulu changer le nom de la table avec drizzle-kit, mais au lieu de mettre à jour le nom de votre table, vous avez obtenu TypeError : Cannot read properties of undefined (reading 'compositePrimaryKeys') ?

Laissez-moi vous expliquer pourquoi cette erreur se produit et comment elle peut être résolue.

Comme vous le savez probablement (ou pas), Drizzle-kit est en version beta et ce problème particulier est très bien connu dans Drizzle-kit, mais n'est malheureusement pas corrigé depuis 2023. Cette TypeError se produit lorsque vous avez une table avec des FK (Foreign keys), donc par exemple nous avons une table nommée 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),
}),
);

Comme vous pouvez le voir, nous avons une connexion entre la table session et la table utilisateur.

Maintenant, si vous voulez renommer la table session en => Sessions par exemple, vous obtiendrez une TypeError 'compositePrimaryKeys' qui conduira à une perte de données (abandon de la table entière). Vous ne voulez pas faire cela.

J'ai trouvé une solution qui fonctionne assez bien. Donc, si vous obtenez cette erreur et que vous voulez par exemple renommer la table, vous devez le faire manuellement via MySQL (j'utilise MySQL comme base de données, mais cela fonctionnera dans n'importe quel autre langage). Si vous hébergez votre base de données chez un fournisseur externe comme PlanetScale, vous pouvez alors exécuter directement les scripts MySQL via l'interface utilisateur (si vous hébergez localement, vous pouvez utiliser PHP Admin ou quelque chose d'autre). Les scripts sont bien connus, il ne devrait donc pas être trop difficile de le faire, mais vous devez être prudent, car vous pouvez casser votre base de données, c'est pourquoi je recommande de faire une sauvegarde de la base de données avant de le faire. Dans mon cas d'utilisation, je voulais renommer ma table, donc j'exécute: RENAME TABLE old_table TO new_table

Après cela, la table a été renommée avec succès, et je n'ai rien cassé dans la base de données et le schéma de Drizzle.

Comme je l'ai déjà dit, ce bogue dans Drizzle-kit est connu de la communauté et vous pouvez suivre les progrès dans ce fil de discussion GitHub : https://github.com/drizzle-team/drizzle-orm/issues/1144

J'espère avoir pu vous aider. Si vous avez des questions, n'hésitez pas à commenter ou à me contacter.

About the author

avatar

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.

compositePrimaryKeys
Drizzle
Drizzle-kit
fix
MySQL
TypeError

Comments

Be the first to comment on this article!