我正在学习 go,最近我学会了如何利用 gorm 连接到数据库。我不知道如何导入所述连接。只在范围内打开和推迟它的关闭func main()
我目前拥有的:
func main(){
db, _ := gorm.Open("postgres", "host=localhost port=5432 user=someUser dbname=someDB password=somePW sslmode=disable")
defer db.Close()
}
Run Code Online (Sandbox Code Playgroud)
这工作正常,我可以创建表并执行 CRUD ......但都在主函数中。
无论如何我可以做这样的事情(它不起作用)并在main中使用它:
func db(){
db, _ := gorm.Open("postgres", "host=localhost port=5432 user=someUser dbname=someDB password=somePW sslmode=disable")
defer db.Close()
return db
}
Run Code Online (Sandbox Code Playgroud)
或者定义某种包,也将允许我这样做。
我知道 defer 基本上只会在 db 返回后关闭连接,但希望你们能明白我的意思。
创建一个包来保存数据库值:
package db
import "github.com/jinzhu/gorm"
var DB *gorm.DB
func Open() error {
var err error
DB, err = gorm.Open("postgres", "host=localhost port=5432 user=someUser dbname=someDB password=somePW sslmode=disable")
if err != nil {
return err
}
}
func Close() error {
return DB.Close()
}
Run Code Online (Sandbox Code Playgroud)
在 中main(),打开数据库并在返回时关闭它:
package main
import (
"import/path/of/package/db"
)
func main() {
if err := db.Open(); err != nil {
// handle error
}
defer db.Close()
... do stuff
}
Run Code Online (Sandbox Code Playgroud)
任何包都可以导入 db 包并以db.DB.
package foo
import (
"import/path/of/package/db"
)
func doSomethignWithDB() {
db.DB.Query("hello")
}
Run Code Online (Sandbox Code Playgroud)
另一种方法是使用您当前的工作。在 main 中打开数据库并将其传递给需要它的函数:
import "github.com/jinzhu/gorm"
func main(){
db, err := gorm.Open("postgres", "host=localhost port=5432 user=someUser dbname=someDB password=somePW sslmode=disable")
if err != nil {
// handle err
}
defer db.Close()
doSomethingWithDB(db)
}
func doSomethingWithDB(db *gorm.DB) {
...
}
Run Code Online (Sandbox Code Playgroud)