My question is similar to How to create a Singleton DB class in GoLang , but I had problems working with individual packages of models and services.
Project / Library / database /mysql.go:
package database import ( "fmt" _ "github.com/go-sql-driver/mysql" "github.com/jinzhu/gorm" ) type Manager struct { *gorm.DB } var Mgr *Manager func init() { dsn := MysqlConnectionString("parseTime=true") tablePrefix := "demo" var err error gorm.DefaultTableNameHandler = func(db *gorm.DB, defaultTableName string) string { return fmt.Sprintf("%v_%v", tablePrefix, defaultTableName) } db, err := gorm.Open("mysql", dsn) if err != nil { panic(err) } Mgr = &Manager{db} }
Project / Library / model / retailer_keys.go
package models import ( "fmt" "project/lib/database" "time" ) type RetailerKeysInterface interface { RetailerKeys() ([]*RetailerKey, error) } type DB struct { database.Manager } type RetailerKey struct { Id int `json:"id"` RetailerId int `json:"retailer_id"` Key string `json:"key"` Enabled *bool `json:"enabled"` CreatedAt *time.Time `json:"created_at"` UpdatedAt *time.Time `json:"updated_at"` } func (db *DB) RetailerKeys() ([]*RetailerKey, error) { var keys []*RetailerKey if err := db.Find(&keys).Error; err != nil { return nil, err } return keys, nil }
Project / Library / services / retailer_keys.go
import ( "fmt" "strings" "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/aws/session" "github.com/aws/aws-sdk-go/service/apigateway" "gopkg.in/volatiletech/null.v6" "project/lib/models" "project/lib/services/api_keys" ) func GetKeys() ([]*models.RetailerKey, error) { var q models.RetailerKeysInterface keys, err := q.RetailerKeys() if err != nil { return nil, err } return keys, nil } func CreateKey(id int) (models.RetailerKey, error) { ... }
Then you can use it in my main package, for example:
package main import ( "context" "encoding/json" // "reflect" "fmt" "github.com/aws/aws-lambda-go/events" "github.com/aws/aws-lambda-go/lambda" _ "project/lib/config" "project/lib/services" ) func Handler(ctx context.Context, request events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) { statusCode := 200 keys, err := services.GetKeys() if err != nil { statusCode = 400 } body, _ := json.Marshal(keys) return events.APIGatewayProxyResponse{ Body: string(body), StatusCode: statusCode, }, nil } ...
I would like to be able to embed a corresponding subset of type Manager in my models.
EDIT: Edited the question / code based on the feedback in the comments.
This gives me an error: runtime error: invalid memory address or nil pointer dereference .