goen v0.0.2には、以下の変更が含まれています。
- CompilerHookの追加
- CompilerOptions.Hookの追加
- CompilerWithHookの追加
これにより、goenが生成したinsert/update/delete用のクエリを、ユーザがカスタマイズできるようになりました。 例えばpostgresのupsertをする場合は
type myHook struct {} func (*myHook) PostInsertBuilder(stmt squirerl.InsertBuilder) squirrel.Sqlizer { return stmt.Suffix("ON CONFLICT DO NOTHING") } func (*myHook) PostUpdateBuilder(stmt squirerl.UpdateBuilder) squirrel.Sqlizer { return stmt } func (*myHook) PostDeleteBuilder(stmt squirerl.DeleteBuilder) squirrel.Sqlizer { return stmt }
dbc := goen.NewDBContext("postgres", db) dbc.Compiler = goen.CompilerWithHook(goen.BulkCompiler, &myHook{}) dbc.Patch(goen.InsertPatch("the_table", []string{"the_column"}, []interface{"the_value"})) dbc.SaveChanges()
これでgoenを使ったupsertが可能になります。 ただこの機能については、もう少しブラッシュアップの必要があるため、しばらく使ってみてAPIに変更を加える可能性が高いです。