4

Beego ORM 目前在某种程度上是不完整的(例如它不支持外键约束)。所以我决定在 Beego 中使用gorm。这样做的正确方法是什么?我看过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()
}

但是我必须在每个控制器功能中每次都连接到数据库吗?有没有办法使用长轮询连接之类的东西?

4

2 回答 2

3

gorm 使用嵌入在 gorm.DB 中的 sql.DB 类型

DB 是一个数据库句柄,表示零个或多个底层连接池。多个 goroutine 并发使用是安全的。sql 包自动创建和释放连接;它还维护一个空闲的空闲连接池。

所以你可以在你的代码中全局使用获得的数据库,如果你想在请求处理中使用事务的隔离级别

tr:=db.Begin()
于 2016-09-08T07:59:32.000 回答
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文件中实现相同的结果,将全局变量声明和连接逻辑直接移动到那里。

于 2017-02-11T17:07:34.230 回答