2016-09-08 2 views
4

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

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() 
} 

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

ответ

3

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

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

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

tr:=db.Begin() 
+0

Не могли бы вы привести более подробный пример? Как точно «полученная БД» (которая определена в 'main.go', если я правильно понимаю) станет доступной в других файлах/пакетах? – EugZol

1

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

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

+0

Как остановить beego от загрузки моделей, как своих? –

Смежные вопросы