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 separateecto_sqlproject, so we need to add that new dependency. (6b3b78cf) -
DBConnection 2.0 no longer ships with Sojourn and Poolboy pools, so we can remove the
poolconfiguration and use the default pool implementation. (760026f3) -
Speaking of pools, we need to make sure
pool_sizeis at least2when 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. (66f9cbdf) -
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 atime_usecfield a value without microsecond precision. (2e34b833) -
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. (3d19f903)
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. (
d3911953) -
Ecto.Multi.run/3now accepts a 2-arity function (first argument is now the Repo) instead of a 1-arity one before. (95d11cc2)
Finally, there were a few minor glitches (or redundancies!) specific to Hex.pm: c4168977, 21eb0bf8, and 0929cd9e.
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.
