Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Mod/prisma #733

Merged
merged 15 commits into from
Jan 14, 2021
Merged

Mod/prisma #733

merged 15 commits into from
Jan 14, 2021

Conversation

Riron
Copy link
Collaborator

@Riron Riron commented Nov 30, 2020

Migration de Prisma à Prisma2.
It's here ! Même si le rebase me donne déjà des sueurs froides 😭

Code

Tous les appels ont été migré vers prisma2. Dans les faits, peu de changements.
Quelques points à noter tout de même:

  • le typing est légèrement plus strict
  • les champs Date doivent maintenant être passés comme des dates et non des string
  • sur les champs typés scalaires URL, on a vraiment des types URL et non des string. Ce n'est pas lié à cette update, donc je suis étonné qu'il ne se soit pas plaint avant. mais j'imagine que prisma appliquait un .toString() automatiquement avant de le sauvegarder donc on ne voyait pas le problème

DB

Plusieurs tables ont été modifiées pour avoir un modèle plus simple / logique. Prisma1 au début créait des tables N-N quelque soit la relation. Certains champs ont donc été modifiés pour simplifier le modèle et passer à du 1-N / 1-1 quand cela avait du sens.
Des champs référencant des foreign key ont également été suffixés par id pour clarifier.
Ces modifs sont faites dans le fichier sql prisma/migration.relations.sql

Le système de seed a été conservé. Au lieu de les runner via prisma, on peut les runner via ts-node directement normalement. (voir fichier seed.ts)

Test d'inté

Le point positif, c'est qu'ils tournent en environ 9min au lieu 30. Les tests sont indentiques, la manière de les runner a un poil changé.
Prisma n'a pas encore de système de gestion des migrations (enfin c'est en bêta), donc je ne me suis pas appuyé dessus. A la place, je stocke un dump de la DB qui est restauré. Pour clean entre chaque test, je déclare une function chargée de truncate toutes les tables. C'est je pense beaucoup plus rapide que le reset prisma1, et à mon sens ca explique en partie les différences du temps de run avec prisma1.
Pour générer un nouveau dump de DB utilisé dans les tests d'inté, j'ai rajouté un flag -g au run.sh.

Migrations

C'est le point manquant. Le système de migrations est encore en bêta donc je ne m'en suis pas servi. De toute manière pour faire l'upgrade de 1 vers 2, il faut forcément le faire directement en SQL.
2 solutions pour les migrations:

  • soit on commence à utiliser le système de prisma2, toujours en bêta
  • soit on plug un système de migration purement sql (style ca)

=> Pour l'instant je suis parti sur une lib de migration, j'avais des problèmes avec le système prisma qui voulait effacer toutes mes données. Pour upgrade vous pouvez run npm run update:dev dans le container.

@Riron Riron force-pushed the mod/prisma branch 4 times, most recently from 5a85e8f to 6f7a557 Compare December 1, 2020 20:49
@Riron Riron marked this pull request as ready for review December 2, 2020 09:09
@Riron Riron force-pushed the mod/prisma branch 4 times, most recently from d7ea253 to 551e4cf Compare December 8, 2020 18:46
@providenz
Copy link
Member

il reste le client prisma 1 généré dans generated qui bloque le build

@Riron Riron force-pushed the mod/prisma branch 12 times, most recently from e8041f8 to 094b246 Compare December 17, 2020 14:24
@Riron Riron force-pushed the mod/prisma branch 4 times, most recently from e755602 to 5c94a6e Compare December 29, 2020 08:39
@Riron
Copy link
Collaborator Author

Riron commented Jan 11, 2021

En effet, j'ai ajouté une note dans le fichier CONTRIBUTING.md

Copy link
Member

@benoitguigal benoitguigal left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🚀 🚀 super nice
Il me semble qu'on a encore un prisma deploy qui traine dans le CI

back/integration-tests/db-deploy/deploy-db.sh Outdated Show resolved Hide resolved
@@ -31,7 +30,7 @@ export async function resetDatabase() {
// We need a longer than 5sec timeout...
jest.setTimeout(10000);

await promisify(exec)("prisma reset --force");
await prisma.$executeRaw("SELECT truncate_tables();");
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

super idée le truncate pour accélérer les tests

"dev": "concurrently npm:watch-node npm:watch-graphql",
"watch-node": "npx nodemon -L --watch src --exec \"ts-node\" src/index.ts",
"watch-node": "npx nodemon -L --watch src --exec \"ts-node\" -r tsconfig-paths/register src/index.ts",
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

je ne suis pas certain de comprendre à quoi sert -r tsconfig-paths/register ici

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

C'est pour que les imports TS non relatifs fonctionnent correctement. Ex import {smthing} from "src/prisma"

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Spécifier le baseUrl dans le tsconfig ne suffit pas ? C'est dommage :/ D'ailleurs au niveau du baseUrl est-ce qu'on ne devrait pas avoir ./src plutôt que . ? Ça éviterait la redondance de src dans les imports.

Copy link
Collaborator Author

@Riron Riron Jan 13, 2021

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Non il faut ca pour faire marcher le baseUrl avec ts-node malheuresement. Ca marche par défaut qu'avec tsc. (de ce que j'ai pu tester en tout cas ! s'il y a un moyen sans je suis preneur)

J'hésitais pour le src mais ca permettait de faire des imports depuis integration-tests/, et je trouve perso que plus clair/lisible parfois d'avoir un prefixe. Ceci dit le préfixe src n'est pas terrible, qque chose comme td-back aurait peut être plus de logique

port: parseInt(process.env.POSTGRES_PORT, 10)
};

migrate(dbConfig, path.join(__dirname, "migrations"))
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Quel est le workflow en local en cas de conflit sur les migrations ? Par exemple, je crée une migration 5_my-migration.sql et au moment de rebase je m'aperçois que quelqu'un a déjà poussé 5_another_migration.sql. J'imagine que je dois renommer ma migration en 6_my_migration.sql mais est-ce que j'ai un moyen de rejouer 5_another_migration.sql ?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Bonne question. S'il voit 2 fichiers qui commencent par le meme nombre il bloque automatiquement et en joue aucune des deux. Mais en local, j'ai l'impression qu'on est un peu obligé de supprimer la ligne de ta migration dans la table migrations à la mano

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Indeed, de même faut pas aller modifier (ne serait ce que reformater) une migration déjà passée, leur contenu est hashé et vérifié, ça plante à la suivante.

@@ -0,0 +1,506 @@
generator client {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

c'est vraiment dommage qu'ils ne permettent pas de séparer les modèles en plusieurs fichiers comme c'était le cas dans prisma 1

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

je crois que c'est prévu dans les futures version

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

pour suivi prisma/prisma#2377

wasteDetailsQuantity Float?
wasteDetailsQuantityType QuantityType?
wasteDetailsPop Boolean @default(false)
readableId String @unique
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

est-ce qu'on ajouterait pas un index sur readableId maintenant que c'est géré https://www.prisma.io/docs/concepts/components/prisma-schema/data-model#defining-an-index

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

La contrainte UNIQUE crée un index déjà non ?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yep, postgre ajoute l'index sur les unique
select * from pg_indexes where tablename = 'Form';

"watch-graphql": "npm run graphql-codegen -- --watch",
"start": "node src/index.js",
"update": "node prisma/scripts/index.js",
"update:dev": "ts-node prisma/scripts/index.ts",
"update": "node prisma/migrate.js && node prisma/scripts/index.js",
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pas certain que ce soit une bonne idée de mélanger les scripts de migration du schéma avec les scripts de migration de données. On a parfois besoin de le jouer en deux temps, par exemple pour loader les numéros SIRET de la gendarmerie il était nécessaire d'uploader un fichier sur le serveur avant.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

J'avais plutot l'impression inverse: le fait que les scripts ne soient pas joués automatiquement fait qu'on a parfois oublié de les jouer lors des release (en recette notamment). Ca me paraissait pas mal de tout automatiser dans la CI, et donc d'avoir un script qui joue tout d'un coup.
Dans le cas de la gendarmerie par ex, j'aurais dit que ca a l'avantage de planter la CI au moment ou il joue le script, donc on se rend forcément compte qu'il manque le fichier et on peut relancer le truc.
Enfin je ne sais pas trop, c'est 2 approches différentes. Je ne suis pas contre modifer si vous pensez que c'est mieux

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

J'aime bien l'idée de le faire automatiquement, ça diminue le nombre de choses à faire manuellement (et donc les erreurs d'oubli). J'ai l'impression que le cas de la gendarmerie reste une exception. Dans 90% des cas le faire automatiquement serait ok et dans 10% des cas ça lèverait une erreur pour attirer notre attention. #my2cents

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Le souci c'est qu'on a 2 systèmes de migrations, schema + data, dont l'historique de l'un est en db et l'autre géré à la mano.
(On peut jouer des fichiers js avec postgres-migrations, pas sûr que ça puisse lancer des appels prisma)

Si on garde update comme ça, faut l'avoir en tête pour les futures migrations de données qui nécessitent des étapes intermédiaires comme l'upload d'un fichier, ou les basculer dans des scripts hors migration.

Pas de préférence en ce qui me concerne.

Copy link
Member

@providenz providenz left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Utilisé depuis un petit moment pour les dasris, no problem so far 👍

@Riron Riron force-pushed the mod/prisma branch 5 times, most recently from 2847469 to b3b9169 Compare January 13, 2021 16:18
@Riron Riron merged commit 7901301 into dev Jan 14, 2021
@Riron Riron deleted the mod/prisma branch January 14, 2021 11:25
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants