Le guide pour résoudre les conflits de migration Prisma

N'exécutez pas prisma migrate reset sur une base de données de production.

Si vous voyez un message indiquant qu'une migration a été modifiée ou que vous devez réinitialiser le schéma, arrêtez-vous. La réinitialisation supprimera toutes vos données. Vous pouvez résoudre ces conflits manuellement sans rien perdre.

Erreurs Prisma courantes et comment les résoudre

Erreur : La migration a échoué en cours d'exécution (P3018) • Corrigez le fichier SQL. • Exécutez : npx prisma migrate resolve --rolled-back [migration_name] • Exécutez : npx prisma db execute --file [path_to_sql_file] • Exécutez : npx prisma migrate resolve --applied [migration_name]

Erreur : Migration modifiée après son application (Incohérence de checksum) • Calculez le hash SHA-256 de votre fichier de migration actuel. • Mettez à jour le checksum dans la table _prisma_migrations. • Important : Mettez à jour toutes les lignes pour ce nom de migration. Ne filtrez pas par rolled_back_at.

Erreur : Colonne manquante dans la base de données shadow (P3006) • Cela se produit lorsqu'une migration fait référence à une colonne qu'une migration ultérieure crée. • Prisma rejoue les migrations par ordre chronologique (timestamp). • Solution : Déplacez le code SQL vers la migration où la colonne est créée pour la première fois.

Erreur : DROP COLUMN bloqué par une politique RLS • La sécurité au niveau des lignes (Row Level Security) de PostgreSQL lie les politiques aux colonnes. • Solution : Utilisez CASCADE lors de la suppression de colonnes. • Exemple : ALTER TABLE "my_table" DROP COLUMN IF EXISTS "tenant_id" CASCADE;

Bonnes pratiques pour des migrations sécurisées

  • Interrogez la base de données en premier. Ne devinez pas si une colonne ou un index existe. Utilisez des requêtes SQL directes pour vérifier votre schéma de base de données réel avant d'écrire le code de migration.
  • Utilisez IF EXISTS et IF NOT EXISTS. Cela rend vos migrations idempotentes. Une migration idempotente peut être exécutée plusieurs fois sans provoquer d'erreurs.
  • Utilisez des blocs DO pour les contraintes. Enveloppez l'ajout de clés étrangères (Foreign Key) dans une vérification pour voir si le nom de la contrainte existe déjà.
  • Utilisez toujours CASCADE pour les suppressions si vous utilisez la sécurité au niveau des lignes (Row Level Security).

Tableau récapitulatif

• P3018 (Échec en cours d'exécution) : Corrigez le SQL, puis utilisez resolve --rolled-back et resolve --applied. • Incohérence de checksum : Calculez le nouveau hash et mettez à jour toutes les lignes dans _prisma_migrations. • Erreur Shadow DB : Vérifiez l'ordre de vos timestamps et déplacez la logique SQL. • Erreur RLS : Ajoutez CASCADE à vos instructions DROP.

Source: https://dev.to/aswindanu_anwar_38c31d278/the-only-guide-you-need-for-prisma-migration-conflicts-without-losing-data-6bc