将数据库初始化为全局变量

时间:2015-10-23 08:33:39

标签: sql go initialization

将数据库初始化为全局变量是一个好主意吗?可以吗?

我正在考虑这样的事情:

func MustDB(d *sql.DB, err error) *sql.DB {
   if err != nil {
     log.Panic(err)
   }
   return d
}

// what I don't know - is how to call db.Close()
// username and password can also be read similar way
var db *DB = MustDB(db.Open(...))

func MustPrepare(db *sql.DB, query string) *sql.Stmt {
  res, err := sql.Prepare(db, query)
  if err!=nil {
    log.Panic(err)
  }
  return ret;
}

优点是,我可以简单地将准备好的sql语句创建为全局变量。我不必创建和管理存储,其中将放置所有sql命令。只有我写:

var s1 *sql.Stmt = MustPrepare(db, "SELECT * FROM MyTable")
var s2 *sql.Stmt = MustPrepare(db, "INSERT INTO MyTable(col1, col2) VALUES(?,?)")
var s3 *sql.Stmt = MustPrepare(db, "DELETE FROM MyTable WHERE col1=?")

你认为,这种模式是有用的,或根本不起作用。

3 个答案:

答案 0 :(得分:2)

开始时,您通常使用Open初始化全局* DB结构(至少在数据库访问包中是全局的)。这不会打开与DB的实际连接,但会创建连接池。因此,应该只有一个实例。您可以在包的init中初始化它。

请参阅 http://go-database-sql.org/ 要么 https://www.vividcortex.com/blog/2015/01/14/the-ultimate-guide-to-building-database-driven-apps-with-go/ 一个很好的介绍性指南。

答案 1 :(得分:0)

是的,这是一个很好的方法。当你浏览go文档时,它清楚地告诉你

  

关闭数据库很少见,因为数据库句柄是长寿命的   并且在很多例行公事之间分享。

Go维护自己的空闲连接池。因此,Open函数应该只调用一次。很少需要关闭数据库。

答案 2 :(得分:-2)

根据经验,我不认为以这种方式使用数据库连接是一种好的做法,您应该将其私有化并根据需要打开/关闭:)

但如果它有效并且你喜欢它,那么这样做就没有错。