При попытке использовать промежуточное ПО buffalo-pop/pop/popmw Transaction
мне не удалось записать в базу данных. Ошибки не возвращаются, а выходные данные отладки показывают операторы SQL, но обновления и вставки не фиксируются.
Обработчик выглядит так:
func MyHandler(c buffalo.Context) error {
tx, ok := c.Value("tx").(*pop.Connection)
if !ok {
return errors.New("no transaction found")
}
f := models.File{
Name: "file.txt",
}
if err := tx.Create(&f); err != nil {
return err
}
return nil
}
app.go:
func App() *buffalo.App {
...
app.GET("/myhandler", MyHandler)
app.Use(popmw.Transaction(models.DB))
...
}
Если я использую DB, _ := pop.Connect("development")
для своего соединения, оно работает правильно. Я также заметил, что значение автоинкремента в таблице меняется каждый раз при попадании в этот обработчик.
В реальном приложении мы не можем вызвать c.Render
, чтобы сообщить код ответа, потому что мы используем gqlgen
в качестве обработчика http. Это выглядит так:
func GQLHandler(c buffalo.Context) error {
h := handler.GraphQL(gqlgen.NewExecutableSchema(gqlgen.Config{Resolvers: &gqlgen.Resolver{}}))
newCtx := context.WithValue(c.Request().Context(), "BuffaloContext", c)
h.ServeHTTP(c.Response(), c.Request().WithContext(newCtx))
return nil
}