Beego ORM暂时不完整(例如它不支持外键约束)。所以我决定将gorm与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()
}
但每次在每个控制器功能中都必须连接数据库吗?有没有办法使用像长轮询连接这样的东西?
答案 0 :(得分:3)
gorm使用嵌入在gorm.DB中的sql.DB类型
DB是表示零或更多池的数据库句柄 基础连接。多个并发使用是安全的 够程。 sql包创建并释放连接 自动;它还维护一个空闲连接池。
因此,您可以在代码中全局使用获取的数据库, 如果你想要请求处理中的隔离级别使用事务
tr:=db.Begin()
答案 1 :(得分:1)
因此,正如@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
文件中可以实现相同的结果,直接移动全局变量声明和连接逻辑。