-
Notifications
You must be signed in to change notification settings - Fork 20
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
Mod/prisma #733
Conversation
5a85e8f
to
6f7a557
Compare
d7ea253
to
551e4cf
Compare
il reste le client prisma 1 généré dans generated qui bloque le build |
e8041f8
to
094b246
Compare
e755602
to
5c94a6e
Compare
En effet, j'ai ajouté une note dans le fichier |
There was a problem hiding this 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
@@ -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();"); |
There was a problem hiding this comment.
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", |
There was a problem hiding this comment.
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
There was a problem hiding this comment.
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"
There was a problem hiding this comment.
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.
There was a problem hiding this comment.
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")) |
There was a problem hiding this comment.
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
?
There was a problem hiding this comment.
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
There was a problem hiding this comment.
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 { |
There was a problem hiding this comment.
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
There was a problem hiding this comment.
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
There was a problem hiding this comment.
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 |
There was a problem hiding this comment.
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
There was a problem hiding this comment.
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 ?
There was a problem hiding this comment.
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';
back/package.json
Outdated
"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", |
There was a problem hiding this comment.
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.
There was a problem hiding this comment.
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
There was a problem hiding this comment.
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
There was a problem hiding this comment.
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.
There was a problem hiding this 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 👍
2847469
to
b3b9169
Compare
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:
Date
doivent maintenant être passés comme des dates et non desstring
URL
et non desstring
. 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èmeDB
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 fichierseed.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
aurun.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:
=> 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.