паттерн в golang с использованием интерфейса.
И вообще кто как соединение к базе архитектурно реализует - желательно с примерами?
файл singleton.go
package storage
import (
"sync"
"project/models"
"project/storage/pg"
)
var handler Handler
var once sync.Once
type Handler interface {
InitConn() error
GetAllAccounts() ([]*models.Account, error)
}
func GetHandler() Handler {
once.Do(func() {
handler = &pg.Handler{}
})
return handler
}
файл impl.go:
package pg
import (
"project/config"
"project/models"
_ "github.com/jackc/pgx/stdlib"
"github.com/jmoiron/sqlx"
"github.com/pkg/errors"
"github.com/sirupsen/logrus"
)
type Handler struct {
*sqlx.DB
}
func (h *Handler) InitConn() error {
dsn := config.GetPgDsn()
logrus.Debugf("dsn: %v", dsn)
var err error
h.DB, err = sqlx.Open("pgx", dsn)
if err != nil {
return errors.Wrap(err, "open postgres connection")
}
err = h.DB.Ping()
if err != nil {
return errors.Wrap(err, "ping postgres connection")
}
return nil
}
func (h *Handler) GetAllAccounts() ([]*models.Account, error) {
sql := `
SELECT id, email, password
FROM project.accounts
WHERE active = true
`
accounts := make([]*models.Account, 0)
err := h.DB.Select(&accounts, sql)
if err != nil {
return nil, errors.Wrap(err, "sql select geo dictionary")
}
return accounts, nil
}
файл main.go с примером инита коннекта и вызовом метода:
package main
import (
"project/storage"
"github.com/sirupsen/logrus"
)
func main() {
err := storage.GetHandler().InitConn()
if err != nil {
logrus.Fatalf("init internal storage connection: %v", err)
}
accounts, err := storage.GetHandler().GetAllAccounts()
if err != nil {
logrus.Errorf("init internal storage connection: %v", err)
}
logrus.Infof("accounts: %v", accounts)
}
То есть тут получается вполне хороший вариант реализации За исключением того что сложнее реализовывается тестирование?
Здесь разве бд закрываться не должна?
import _ "github.com/jackc/pgx/stdlib" в main.go должен быть реализация, как по мне, неплохо очень
Да все правильно, писал наскоро и такой момент пропустил. Всегда закрывается
Обсуждают сегодня