Updating Hex.pm to Ecto 3.0
Ecto 3.0 is just around the corner and as you may already know it reached stable API. To make sure everything works properly I thought I’ll try updating one of the first projects that ever used Ecto: Hex.pm.
The whole upgrade was done in a single pull request, which we will break down below.
First, the required steps:
- Update mix.exs to depend on
ecto_sqland bump the postgrex dependency. Note: SQL handling have been extracted out into a separate
ecto_sqlproject, so we need to add that new dependency. (
- DBConnection 2.0 no longer ships with Sojourn and Poolboy pools, so we can remove the
poolconfiguration and use the default pool implementation. (
- Speaking of pools, we need to make sure
pool_sizeis at least
2when running migrations.
- JSON library is now set on the adapter and not on Ecto (
e16ebd8f) and because we were already using the recommended package, Jason, we don’t need that configuration anymore. (
- Ecto 3.0 makes date/time handling stricter with regards to precision. So we need to either update the types of our schema fields or make sure we truncate date/time values. For example, when we define a field as
timewe can’t put value with microsecond precision and similarly we can’t put into a
time_usecfield a value without microsecond precision. (
- Constraint handling functions like
Ecto.Changeset.unique_constraint/3are now including in the error metadata the type and the name of the constraint, which broke our test that was overly specific. (
Secondly, we got a couple deprecation warnings so here are the fixes:
- Adapter is now set when defining Repo module and not in the configuration. (
Ecto.Multi.run/3now accepts a 2-arity function (first argument is now the Repo) instead of a 1-arity one before. (
Overall the update process was pretty straightforward. There were a few minor bugs along the way which were promptly fixed upstream. Having previously updated Hex.pm to Ecto 2.0, which took a few months (we started it early on, which made it a fast moving target back then), I can really appreciate the level of maturity that Ecto achieved and how easy it was to update this time around. :-)
Update: Add note about
pool_size when running migrations.
P.S.: This post was originally published on Plataformatec’s blog.