Environment Diff
De functie Environment Diff stelt je in staat om de databaseschema’s van twee omgevingen naast elkaar te vergelijken. Dit is handig om te begrijpen welke schemawijzigingen zijn doorgevoerd in een branch voordat je deze merge terug naar de parent, of om structurele verschillen tussen twee omgevingen te auditen.

Hoe Diff werkt
Section titled “Hoe Diff werkt”De vergelijkingsengine identificeert structurele verschillen tussen omgevingen in drie fasen:
- Schema-analyse: Het systeem introspeert zowel de bron- als doelomgeving om hun volledige structuur te begrijpen — inclusief tabellen, kolommen, indexen, constraints en relaties.
- Vergelijking: De twee structuren worden vergeleken volgens forward-only semantiek (hieronder uitgelegd). De engine identificeert precies welke wijzigingen van de bronomgeving ontbreken in het doel.
- Migratiegeneratie: Voor elke gedetecteerde wijziging genereert het systeem automatisch de bijbehorende SQL-opdrachten die nodig zijn om die wijziging veilig toe te passen op de doelomgeving.
Forward-Only Diff-semantiek
Section titled “Forward-Only Diff-semantiek”De diff-engine gebruikt forward-only semantiek. Dit betekent:
- Objecten die in bron bestaan maar NIET in doel → getoond als
CREATED(ze moeten in doel worden aangemaakt) - Objecten die in BEIDE bestaan → veld voor veld vergeleken, verschillen getoond als wijzigingen
- Objecten die ALLEEN in doel bestaan → NIET getoond als
DROPPED
Dit is een belangrijk ontwerpbesluit. Als een tabel alleen in de doelomgeving bestaat, was deze nooit aanwezig in de bron. Deze tonen als TABLE_DROPPED zou misleidend zijn omdat er nooit een drop-bewerking in de bron is uitgevoerd. De diff richt zich uitsluitend op wijzigingen die in de bron zijn ontstaan en naar het doel moeten worden doorgevoerd.
Uitzondering: Voor wijzigingen op kolomniveau binnen tabellen die in beide omgevingen bestaan, wordt COLUMN_DROPPED WEL gedetecteerd omdat het een daadwerkelijke kolomverwijderingsbewerking vertegenwoordigt die in de bron is uitgevoerd.
Wijzigingstypen
Section titled “Wijzigingstypen”De diff-engine detecteert de volgende categorieën schemawijzigingen:
| Wijzigingstype | Beschrijving | Breaking |
|---|---|---|
TABLE_CREATED | Een tabel bestaat in bron maar niet in doel | Nee |
COLUMN_ADDED | Een nieuwe kolom is toegevoegd aan een tabel in bron | Nee |
COLUMN_DROPPED | Een kolom bestaat in doel maar is verwijderd in bron | Ja |
COLUMN_TYPE_CHANGED | Het gegevenstype van een kolom is gewijzigd | Afhankelijk* |
COLUMN_NULLABLE_CHANGED | De nullable-constraint van een kolom is gewijzigd | Afhankelijk |
COLUMN_DEFAULT_CHANGED | De standaardwaarde van een kolom is gewijzigd | Nee |
INDEX_CREATED | Een nieuwe index is toegevoegd | Nee |
INDEX_DROPPED | Een index is verwijderd | Nee |
ENUM_CREATED | Een nieuw enum-type bestaat in bron maar niet in doel | Nee |
ENUM_VALUE_ADDED | Een nieuwe waarde is toegevoegd aan een enum | Nee |
ENUM_VALUE_REMOVED | Een waarde is verwijderd uit een enum | Ja |
VIEW_CREATED | Een view bestaat in bron maar niet in doel | Nee |
VIEW_MODIFIED | De SQL-definitie van een view is gewijzigd | Nee |
RELATIONSHIP_ADDED | Een nieuwe foreign key-relatie is toegevoegd | Nee |
RELATIONSHIP_DROPPED | Een foreign key-relatie is verwijderd | Ja |
* Type-vernauwing (bijv. text → varchar(50) of int8 → int4) wordt als breaking geclassificeerd omdat dit gegevensverlies kan veroorzaken. Type-verbreding (bijv. varchar → text) wordt als veilig geclassificeerd.
Let op: Top-level TABLE_DROPPED, ENUM_DROPPED en VIEW_DROPPED worden niet gegenereerd door de forward-only diff. Objecten die alleen in doel bestaan worden niet als “dropped” beschouwd vanuit het bronperspectief.
Cherry-Pick-selectie
Section titled “Cherry-Pick-selectie”De diff-weergave ondersteunt selectieve wijzigingstoepassing. Gebruikers kunnen:
- Individuele wijzigingen selecteren of deselecteren met selectievakjes
- Alle wijzigingen binnen een groep selecteren of deselecteren (bijv. alle wijzigingen voor een specifieke tabel) met het groepsselectievakje
- Breaking wijzigingen (destructief) zijn standaard niet vooraf geselecteerd — de gebruiker moet expliciet kiezen
Alleen geselecteerde wijzigingen worden meegenomen bij het toepassen van de merge.
GraphQL API
Section titled “GraphQL API”Query: environmentDiff
Section titled “Query: environmentDiff”query EnvironmentDiff($input: EnvironmentDiffInput!) { environmentDiff(input: $input) { success message changes { changeType objectType objectName fieldName oldValue newValue isBreaking sql } summary { totalChanges breakingChanges addedTables droppedTables modifiedTables } }}Variables:
{ "input": { "projectId": "f7e4a264-d659-4719-91e8-c2d74654e529", "sourceEnvironment": "master", "targetEnvironment": "staging" }}De Diff-output begrijpen
Section titled “De Diff-output begrijpen”Elke vermelding in de changes-array vertegenwoordigt een enkele schemawijziging met de volgende velden:
changeType: Een van de hierboven genoemde wijzigingstype-identifiers.objectType: Het soort databaseobject dat is aangetast (table,column,index,enum,view,relationship).objectName: De naam van het aangetaste object (bijv. de tabelnaam).fieldName: Voor wijzigingen op kolomniveau, de naam van de specifieke kolom.oldValue/newValue: De voor- en nawarden voor wijzigingen (bijv."varchar(255)"→"text").isBreaking: Een boolean die aangeeft of deze wijziging gegevensverlies of API-breuk kan veroorzaken.sql: De gegenereerde DDL-instructie om deze wijziging toe te passen.