数据库连接
Peter Bourgon在[Translation]现代GO的一些理论中认为不应当产生包级别变量,而是应该将诸如数据库连接变量传递,事实上这也是事务控制所必须的方法。 个人建议在model层/包下维护全局变量db,直接使用db进行查询,但是禁止对db进行赋值(数据库连接一旦被赋值可能造成非常严重的后果,例如db = nil):
go
复制代码
// model 包下
var db *gorm.DB
func initDB (){
db,err = gorm.Open()
...
}
对于特定数据库连接,例如事务控制tx,可以对其进行返回来避免数据库连接的覆盖,以及在需要事务的时候进行事务控制:
scss
复制代码
func getDB(dbs ...*gorm.DB) *gorm.DB {
if len(dbs) > 0 {
return dbs[0]
}
return db
}
func (ctl *StudentCtl) QueryStudent(dbs... *gorm.DB){
tx := getDB(dbs...)
...
我们使用 mysql 驱动打开一个 MySQL 数据库连接,并配置了数据库连接信息。然后,我们使用 GORM 的 Open 方法打开数据库连接,并将连接对象保存在 db 变量中。最后,我们使用 defer 关键字来确保在程序结束时关闭数据库连接。
需要注意的是,dsn 字符串中的 user 和 password 分别代表数据库用户名和密码,127.0.0.1:3306 代表数据库的地址和端口号,dbname 代表数据库的名称。如果你使用的是其他数据库,比如 PostgreSQL、SQLite 等,需要将 mysql.Open 替换为相应的驱动。