fiskeben
fiskeben

Reputation: 3467

How can I share database connection between packages in Go?

I declare my database connection in my main package, sort of like this:

package main

var Db *sql.DB

func main() {
    var err error
    db, err = sql.Open("postgres", "stuff...")

    // error handling and more app stuff
}

To begin with I had all of my code in the main package and I could access the database connection from other files. However, I want to separate code into packages, and now the Db variable isn't visible anymore.

Is it possible to share it across packages or do I have to add it as a parameter to whatever calls to other packages I have in my main function?

Upvotes: 1

Views: 3900

Answers (1)

Oscar Swanros
Oscar Swanros

Reputation: 19969

I'll share a bit of code currently in one of my apps.

First...

package conf

import (
    "github.com/jinzhu/gorm"
    _ "github.com/lib/pq"
)

func ConnectDB() *gorm.DB {
    db, err := gorm.Open("postgres", /**/)
    if err!=nil {
        panic(err)
    }

    db.LogMode(true)

    return &db
}

Then....

package model

import (
    "github.com/jinzhu/gorm"
)

var DB *gorm.DB

func SetDatabase(db *gorm.DB) {
    DB = db
    // Some other set up here
}

Finally...

package main

import (
    "conf"
    "model"
)

func main() {
    db := conf.ConnectDB()
    model.SetDatabase(db)
    // Some other stuff
}

Hope this helps.

Upvotes: 6

Related Questions