Как использовать Горм с Beego

Beego ORM пока что неполон (например, он не поддерживает ограничения внешнего ключа). Поэтому я решил использовать Горм с Beego. Как правильно это сделать? Я видел пример кода из Gorm:

import (
    "github.com/jinzhu/gorm"
    _ "github.com/jinzhu/gorm/dialects/postgres"
)

func main() {
  db, err := gorm.Open("postgres", "host=myhost user=gorm dbname=gorm sslmode=disable password=mypassword")
  defer db.Close()
}

Но нужно ли мне каждый раз подключаться к базе данных в каждой функции контроллера? Есть ли способ использовать что-то вроде длинных опросных соединений?

2 ответа

Gorm использует тип sql.DB, встроенный в Gorm.DB под капотом, который

DB - это дескриптор базы данных, представляющий пул из нуля или более базовых соединений. Это безопасно для одновременного использования несколькими программами. Пакет sql создает и освобождает соединения автоматически; он также поддерживает свободный пул свободных соединений.

Таким образом, вы можете использовать полученную БД глобально в своем коде, если вы хотите уровень изоляции при обработке запроса, используйте транзакцию

tr:=db.Begin()

Итак, как отметил @Uvelichitel, вы можете определить свой db подключение на глобальном уровне и использовать его из нужного места (вероятно, основная функция для открытия уровня подключения и модели для запроса результатов).

Таким образом, вы можете получить файл с логикой соединения с БД:

// appname/conn.go

package db

import (
  "github.com/jinzhu/gorm"
  ...
)

var (
  // this one gonna contain an open connection
  // make sure to call Connect() before using it
  Conn *gorm.DB
)

func Connect(dbConnString string) (*gorm.DB, error) {
  db, err := gorm.Open("postgres", dbConnString)
  Conn = db
  return db, err
}

После звонка db.Connect от твоего main.go вы можете использовать открытое соединение db.Conn из любого места вашего приложения (просто убедитесь, что вы импортируете этот пакет в места использования).

import "appname/db"

func main() {
  conn, _ := db.Connect("host=localhost user=postgres ...")
  // db.Conn is initialized and ready for usage anywhere else

Тот же результат может быть достигнут в течение одного main.go файл, перемещение объявления глобальной переменной и логики соединения прямо там.

Другие вопросы по тегам