Adam Gundry
The appraoch to data schema migration relies on two DSLs: one that describes the data model, and one that describes the changelog. As most data model schemas, it’s typed. Here’s an example.
User
= record
name :: Username
admin :: boolean
Username
= basic string
If you were to add a new record
User
= record
name :: Username
admin :: boolean
logins :: LoginCount
Username
= basic string
LoginCount
= basic integer
You could express the change in the following way:
version "0.2"
changed record User
field added
logins :: LoginCount
default 0
added LoginCount
basic integer
Question: Is this autogenerated or written by a programmer?
Answer: In many cases yes, it’s autogenerated, but you also have to option to manually author changelogs as well.
With these in place you can do some analysis about whether, for example, you can get from an older version to the latest version. Futhermore, you can interpret the changelog and produce a migration that you can run on your data. If the changelog language does not support a particular operation you need, there’s a release valve built-in that allows you to run arbitrary Haskell code within an upgrade.
All records in the system are stored with a schema version. So the upgrade process (which the presenter notes is a “Stop the World” upgrade) proceeds as follows:
The result is easy changes are very simple and straightforward, with validation identifying erorrs before they’re executed.