logo Buffalo slack logo
Integración con Buffalo
Base de datos

Integración con Buffalo#

Generando una nueva App#

Cuando generas una nueva aplicación de Buffalo puedes escoger la base de datos de destino con el flag --db-type. Por ejemplo, para generar una nueva app con soporte para la base de datos MySQl, puedes escribir lo siguiente:

$ buffalo new coke --db-type mysql

Por defecto, buffalo generará una aplicacion con PostgreSQL como la base de datos de respaldo.

Saltar soporte de la base de datos#

Si deseas manejar la base de datos sin usar Pop. o si estas construyento una app sin base de datos, es posible saltar la generacion de todos los componentes de base de datos con el flag --skip-pop.

$ buffalo new coke --skip-pop

El middleware de transacción de Pop#

Buffalo proporciona un middleware para facilitar el uso de la base de datos dentro de Buffalo: buffalo-pop

Configuración#

Este middleware es configurado para ti por defecto, si escoges usar Pop cuando creas un nuevo proyecto.

// actions/app.go

import "github.com/gobuffalo/buffalo-pop/v3/pop/popmw"

func App() *buffalo.App {
  // ...
  app.Use(popmw.Transaction(models.DB))
  // ...
  app.GET("/", HomeHandler)
  // ...
}

popmw.Transaction(models.DB) usa la conexión de la base de datos configurada para crear un nuevo middleware Transaction. Este middleware hace lo siguiente:

  • Registra la duración total gastada durante la solicitud de realizar llamadas a la base de datos.
  • Envuelve cada petición HTTP en una transacción de base de datos.
  • Hace commit si no hay ningun error ejecutando los middlewares y la accion; y el estado de la respuesta es un 2xx o 3xx
  • De lo contrario, hace Rollback.

Manejar la transacción a mano#

Si necesitas manejar tu transacción a mano, tu puedas saltar el middleware para una ruta dada:

// actions/app.go

import "github.com/gobuffalo/buffalo-pop/v3/pop/popmw"

func App() *buffalo.App {
  // ...
  txm := popmw.Transaction(models.DB)

  app.Use(txm)
  app.Middleware.Skip(txm, HomeHandler)
  // ...
  app.POST("/form", FormHandler)
  app.GET("/", HomeHandler)
  // ...
}