Как использовать Горм с 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
файл, перемещение объявления глобальной переменной и логики соединения прямо там.