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.
We are glad to be an active part of the process by contributing to the ecosystem and helping companies adopt Elixir at different stages of their adoption cycle. We would love to work with you too!
Do you think that your company could benefit from our expertise and assistance? Just click the button below.