DEV Community

gumi TECH for gumi TECH Blog

Posted on

Ecto 3.0: 互換性を破る変更予定について

Ecto 3.0のリリースが近づいてきました。本稿はplataformatec社の許諾を得て、開発チームのblog記事「A sneak peek at Ecto 3.0: breaking changes」から、内容をかいつまんでご紹介します。3.0というメジャーバージョンのアップデートではあるものの、後方互換性を破る変更は、おもにつぎの3つの領域に絞られるようです。

  • Ectoリポジトリの分離
  • 非推奨だったEcto datetime型を除き、Elixirに備わるCalendar型に替える
  • JSONの扱いを最適な手法に改める

今回は、後方互換性に関わる注意点についてご説明します。新機能やパフォーマンスの改善については、のちの同社blog記事で紹介されるでしょう。

Ectoリポジトリをectoとecto_sqlに分ける

Ecto 3.0はectoecto_sqlのふたつのリポジトリに分けられます。Ecto 2.0から開発者とチームの数は増え、デーベースはなしにデータマッピングと検証に使われてきました。けれど、アプリケーションにEctoを用いると、SQLに関わるアダプタやサンドボックスあるいはデータの移行などが混在するようになりました。

Ecto 3.0ではすべてのSQLアダプタは別のリポジトリに移し、Ectoは、スキーマ、チェンジセット、クエリ、リポジトリの4つの構成要素に焦点を当てます。

EctoをSQLデータベースで使っているなら、Ecto 3.0への移行はとても簡単です。これまでの記述はつぎのようでした。

{:ecto, “~> 2.2”}

Enter fullscreen mode Exit fullscreen mode

これを以下に書き替えてください。

{:ecto_sql, “~> 3.0”}

Enter fullscreen mode Exit fullscreen mode

Ectoをデータの操作だけに使っていてデータベースへのアクセスがなければ、バージョンの変更だけで済みます。

Calendar型

Ecto.DateEcto.TimeおよびEcto.DateTimeはなくなります。替わりに、DateTimeそしてDateTimeおよびNaiveDateTimeをお使いください。Elixirに備わっていて、Ecto 2.1から推奨されてきた型です。すでに非推奨の型でなく、これら新しい型を使っていれば問題ありません。

この機会に、すべてのデータベースでマイクロ秒をサポートするように統合しました。:time:naive_datetimeおよび:utc_datetime型は、マイクロ秒の情報はもちません。Ecto 3.0はマイクロ秒を保持する:time_usec:naive_datetime_usecおよび:utc_datetime_usec型を採り入れました。移行とスキーマにマイクロ秒を保ちたいときは、リポジトリの設定が必要です。

config :my_app, MyApp.Repo,
migration_timestamps: [type: :naive_datetime_usec]
Enter fullscreen mode Exit fullscreen mode

また、スキーマはつぎのとおりです。

@timestamps_opts [type: :naive_datetime_usec]
Enter fullscreen mode Exit fullscreen mode

データベースアダプタもElixirの型で動作するように標準化されています。開発でロークエリを実行したとき、タプルは返されませんのでご注意ください。

JSONの処理

Ecto 3.0はJSONライブラリの管理をアダプタに移しました。すべてのアダプタはJSONがデフォルトです。

つぎの設定は警告が示されますので、以下のように書き替えてください。

config :ecto, :json_library, CustomJSONLib
Enter fullscreen mode Exit fullscreen mode

Postgres

config :postgrex, :json_library, CustomJSONLib
Enter fullscreen mode Exit fullscreen mode

MySQL

config :mariaex, :json_library, CustomJSONLib
Enter fullscreen mode Exit fullscreen mode

Poisonにロールバックするには、アダプタをつぎのように設定します。

Postgres

config :postgrex, :json_library, Poison
Enter fullscreen mode Exit fullscreen mode

MySQL

config :mariaex, :json_library, Poison
Enter fullscreen mode Exit fullscreen mode

ただし、JSONへの移行が推奨されます。Poisonのビルトインサポートは、将来のEcto 3.xのリリースで除かれるでしょう。

その他の変更

データ型が統一されましたので、Ecto.DataTypeプロトコルは要らなくなり、除かれました。このプロトコルを実装していた場合、削除すれば問題なく動作します。

Ecto.Multi.run/5はrepoモジュールを受け取るように改善されました。トランザクションは第1引数で実行されます。したがって、module-function-argsはどのEcto.Multi関数にも渡せます。最初の引数としてrepoを受け取るように書き替えてください。この変更により、クリーンで結合の少ないコードが書けるでしょう。

この後のblog記事では、Ecto 3.0の接頭辞(prefix)サポート(PostgreSQLのいゆわるschemas)が採り上げられるでしょう。これまでは、クエリ全体に対してのみ定めることができました。Ecto 3.0では細かく設定できるようになります。スキーマで@schema_prefix属性を与えてあれば、影響はそのスキーマのみで、全体には及びません。

関連記事

Top comments (0)