mmag

ハマったことメモなど

Ecto

PostgreSQLでpublic以外のスキーマをつくって使う

dev.classmethod.jp という記事を見かけたのが発端。いままで特に深く考えずにpublicスキーマの世界で生きていたんだけど、ユーザごとにスキーマつくって権限あげるのがお行儀いいよな、と思ってやってみた。 -- init.sql CREATE DATABASE mydb TEMPLATE='te…

Ectoのカスタムロガー

github.com 3.0-rc.1がもっぱら話題のEctoですが、ロガーを追加する方法をたまたま見つけたので書いておきます。Ecto.Repoをuseするときにloggersっていうオプションを渡します。 defmodule MyApp.Repo do use Ecto.Repo, otp_app: :my_app, loggers: [ {Ect…

EctoからSQL関連の機能が分離されるらしい

github.com EctoはポスグレなんかのRDBMSと使われることが多いと思われるけど、役割としてはschemaでデータの構造を定義したりchangesetでデータを操作したりrepoを通して実際にデータを保存したりといろいろあり、SQLを扱うことだけが仕事じゃない。どんな…

あっちこっちでpreload問題

こんばんは。 Ectoでは関連を明示的にpreloadすることがよくあります。例えばUserがPostを複数持っていて、それをUserControllerのshowアクションでこんなjsonで返したいとき、 { "user": { "name": "joe_noh", "posts": [ {"title": "...", body: "..."}, {…

Ecto.Changeset.change/2 知らなかった

Ectoのmany_to_manyのドキュメントを読んでいたら、使用例の中でEcto.Changeset.change/2という関数が使われていました。 構造体からchangesetをつくってくれる関数なようです。知らなかった。struct入れてもchangeset入れてもいいみたい。キャストやバリデ…

validate_confirmation/3 という存在を思い出した

一通り実装してから、Ecto.Changeset.validate_confirmation/3があったことを思い出してしまった。 model |> cast(...) |> validate_confirmation(:password) ってすると、passwordとpassword_confirmationの値が一致してるかチェックしてくれる。

Ecto 2.0.0-betaを試す (3)

今回はEcto.Multiです。 なにそれ Ecto.Multiとはそもそも何かというと、1つのトランザクション内で行われるべき複数のRepo操作をまとめるデータ構造です。DBを操作する前にどのような変更がなされるのか覗き見することができます。これの導入に伴い、before…

Ecto 2.0.0-betaを試す (2)

第2弾です。 今回はリレーションです。以前からあるhas_one, has_manyを復習し、新たに入ったmany_to_manyを試してみます。 TL;DR これ書いてる時点のコードはこちら。 github.com has_one User has_one Profile を作っていきます。Userは前回つくったので割…

Ecto 2.0.0-betaを試す (1)

はい。 Ectoはしばらく触っていなかったのですが、v2.0がもうすぐということで触ってみました第1弾。 まずはプロジェクトをセットアップして単純なinsertのテストを通すところまで。 TL;DR こちらに今日時点のコードがあるので、細かいとこは飛ばしていきま…

Ectoで複数のRepoを使う

なにがしたい 例えば、レガシーなシステムを徐々にモダンにしていきたいので、古いDBと新しいDBを 共存させたいとします。要は、異なる接続先の2つ3つのDBを使いたい。 どうする Repoを2つ作ります。 以下、Phoenixのディレクトリ構成に合わせて説明します。…