170 похожих чатов

Выношу на суждение следующую реализацию соединения к БД через singleton

паттерн в 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)

}

4 ответов

12 просмотров
Egor- Автор вопроса

То есть тут получается вполне хороший вариант реализации За исключением того что сложнее реализовывается тестирование?

Здесь разве бд закрываться не должна?

import _ "github.com/jackc/pgx/stdlib" в main.go должен быть реализация, как по мне, неплохо очень

Egor- Автор вопроса
Sula
Здесь разве бд закрываться не должна?

Да все правильно, писал наскоро и такой момент пропустил. Всегда закрывается

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта