xorm.EngineGroupで複数のDBをまとめる

データベースをWriterとReaderで分けている時、xorm.ioのEngineGroupを使うことでどちらのDBを使うのかを任せられるようになります。

使い方は通常のNewEngineと似ていて、NewEngineGroupの第2引数に接続先をスライスで渡します。
接続先のスライスは1番目がWriter、2番目以降がReaderになります。

xorm.NewEngineGroup(driverName, []string{dsnWriter, dsnReader})

もしくは既存のEngineを直接渡すこともできます。
この時は第1引数がWriterで第2引数がReaderのスライスです。

xorm.NewEngineGroup(engineWriter, []*xorm.Engine{engineReader})

これで自動的に参照クエリはReader、更新クエリはWriterが使われるようになります。
また、トランザクションの中では参照クエリでもWriterが使われます。

  • Readerが使われる
func get(eg *xorm.EngineGroup, bean interface{}) {
    s := eg.NewSession()
    s.Get(bean)
}
  • Writerが使われる
func insert(eg *xorm.EngineGroup, bean interface{}) {
    s := eg.NewSession()
    s.Insert(bean)
}
func getTx(eg *xorm.EngineGroup, bean interface{}) {
    s := eg.NewSession()
    s.Begin()
    s.Get(bean)
    s.Commit()
}

この動作は以下のコードを使用して確認しました。
(実際のDBに接続していないのでエラーは無視しています)

play.golang.org

ただGoだとxorm以外に同じようなことができるORMを知らないんですが、やっぱりアプリケーションの中でやるよりも外でやった方が良いから他では実装されないんですかね。