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はecto
とecto_sql
のふたつのリポジトリに分けられます。Ecto 2.0から開発者とチームの数は増え、デーベースはなしにデータマッピングと検証に使われてきました。けれど、アプリケーションにEctoを用いると、SQLに関わるアダプタやサンドボックスあるいはデータの移行などが混在するようになりました。
Ecto 3.0ではすべてのSQLアダプタは別のリポジトリに移し、Ectoは、スキーマ、チェンジセット、クエリ、リポジトリの4つの構成要素に焦点を当てます。
EctoをSQLデータベースで使っているなら、Ecto 3.0への移行はとても簡単です。これまでの記述はつぎのようでした。
{:ecto, “~> 2.2”}
これを以下に書き替えてください。
{:ecto_sql, “~> 3.0”}
Ectoをデータの操作だけに使っていてデータベースへのアクセスがなければ、バージョンの変更だけで済みます。
Calendar型
Ecto.Date
とEcto.Time
およびEcto.DateTime
はなくなります。替わりに、Date
とTime
そして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]
また、スキーマはつぎのとおりです。
@timestamps_opts [type: :naive_datetime_usec]
データベースアダプタもElixirの型で動作するように標準化されています。開発でロークエリを実行したとき、タプルは返されませんのでご注意ください。
JSONの処理
Ecto 3.0はJSONライブラリの管理をアダプタに移しました。すべてのアダプタはJSONがデフォルトです。
つぎの設定は警告が示されますので、以下のように書き替えてください。
config :ecto, :json_library, CustomJSONLib
Postgres
config :postgrex, :json_library, CustomJSONLib
MySQL
config :mariaex, :json_library, CustomJSONLib
Poisonにロールバックするには、アダプタをつぎのように設定します。
Postgres
config :postgrex, :json_library, Poison
MySQL
config :mariaex, :json_library, Poison
ただし、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)