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_sql
and bump the postgrex dependency. Note: SQL handling have been extracted out into a separateecto_sql
project, 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
pool
configuration and use the default pool implementation. (760026f3
) -
Speaking of pools, we need to make sure
pool_size
is at least2
when 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
time
we can’t put value with microsecond precision and similarly we can’t put into atime_usec
field a value without microsecond precision. (2e34b833
) -
Constraint handling functions like
Ecto.Changeset.unique_constraint/3
are 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/3
now 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.