I'm learning go and I've recently learned how to leverage gorm to connect to a database. I can't figure out how to import said connection. Only open and defer it's closing in the scope of the func main()
What I have currently:
func main(){
db, _ := gorm.Open("postgres", "host=localhost port=5432 user=someUser dbname=someDB password=somePW sslmode=disable")
defer db.Close()
}
This works fine and I can create tables and do CRUD ... but all in the main function.
Is there anyway I can do something like this(it didn't work) and use it in main:
func db(){
db, _ := gorm.Open("postgres", "host=localhost port=5432 user=someUser dbname=someDB password=somePW sslmode=disable")
defer db.Close()
return db
}
Or define some kind of package that will also allow me to do this.
I know that defer will basically just close the connect once db returns, but hopefully you guys get what I'm going for.
Create a package to hold the database value:
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()
}
In main()
, open the database and close it on return:
package main
import (
"import/path/of/package/db"
)
func main() {
if err := db.Open(); err != nil {
// handle error
}
defer db.Close()
... do stuff
}
Any package can import the db package and access the database as db.DB
.
package foo
import (
"import/path/of/package/db"
)
func doSomethignWithDB() {
db.DB.Query("hello")
}
Another approach is to use what you currently have working. Open the database in main and pass it to the functions that need it:
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) {
...
}