
Dmitri
08.06.2018
07:28:08
пишем result, err := db.Query('INSERT INTO table_name (data_field1, date_field2) VALUES('DATA1', DATA2)') и ждем, что в result будет лежать что-то с айдишником вставленной записи внутри
пробуем с мускулем - все ок
а потом нам благодарный пользователь постгре рассказывает, что мы мудаки
потому что для него запрос должен выглядеть так INSERT INTO table_name (data_field1, date_field2) VALUES('DATA1', DATA2) RETURNING id

Google

Dmitri
08.06.2018
07:29:39
сама идея скормить DAO инициализированное соединение с базой - норм
создал sql.Connection и засунул в конструктор DAO
при этом DAO для мускуля в конструктор хочет sql.Connection

Александр
08.06.2018
07:31:02
ну окей, а где само дао иницилизируется?
в main?

Dmitri
08.06.2018
07:31:19
а DAO для файла-в-котором-хранится-все вполне может захотеть os.File
а то и io.ReadWriter
оно понятно, что и постгре, и мускуль, и мс-скуль, один хрен, будут юзать sql.DB

Александр
08.06.2018
07:32:39
ну как вариант вижу в пакете db (моем пакете) просто сделать по 1 функции на каждую бд с инициализацией, но возращать уже готовый коннект

Dmitri
08.06.2018
07:33:03
в DAO отдавай sql.DB

Александр
08.06.2018
07:33:44
func NewMysqlDriver() *sql.DB {
}
func NewMongoDbDriver() *mongo.Session {
}
и в майн получится что-то

Google

Dmitri
08.06.2018
07:33:54
и это в том случае, если у тебя реализация DAO поверх РСУБД

Александр
08.06.2018
07:34:31
mysql := db.NewMysqlDriver()
mongo := db.NewMongoDbDriver()
(параметры забыл, но это пример)

The
08.06.2018
07:34:47
ну почему драйвер то(((

Dmitri
08.06.2018
07:35:56
в main тогда (абстрагируясь от неудачных названий)
mysql := db.NewMysqlDriver()
myAwesomedao := dao.NewAwesomeMysqlDAO(mysql)
а потом уже с этим живи)

Александр
08.06.2018
07:36:25
просто мы тогда хедлер прибиваем к конкретному дао выходит

Dmitri
08.06.2018
07:36:42
с чего это

The
08.06.2018
07:36:52
не прибиваешь ты ничего, если твое дао - это интерфейс

Dmitri
08.06.2018
07:37:06
вот DAO и должно тебя абстрагировать от источника данных

Александр
08.06.2018
07:37:47
у меня конечно дао больше от домена зависит чем от источника ?
есть бизнесовый пакет user и там есть dao

Dmitri
08.06.2018
07:38:21
дальше у тебя
type UniversalDAO inteface {
Create(...) ...
Read(...) ...
}
func NewHandler(dao UniversalDAO) {...}

Александр
08.06.2018
07:39:06
ну CRUD может и не хватить

Dmitri
08.06.2018
07:39:23
и в мейне:
mysql := db.NewMysqlDriver()
myAwesomedao := dao.NewAwesomeMysqlDAO(mysql)
logic := packageName.NewHandler(myAwesomedao)

The
08.06.2018
07:39:58
зачем в мейне вообще вы это делаете все?

Александр
08.06.2018
07:41:32
в мейне стартует viper командный парсер, внутри комманды живет кастомный сваггер сервер, в который принудительно накормлены хедлеры ( по умолчанию там просто коллбеки в файле поправить по живому)
на соседнем проекте вообще не парились и тупо все в callback реализовали
полотно на over9000 строк

Google

The
08.06.2018
07:43:36
жуть какая-то

Александр
08.06.2018
07:44:06
ну я хоть как то пытаюсь это выправить

The
08.06.2018
07:45:11
попробуй глянуть это https://8thlight.com/blog/uncle-bob/2012/08/13/the-clean-architecture.html

Александр
08.06.2018
07:45:53
да там автогенеруемый сваггер сервер уже "чистая архитектура"
кто его писал руки бы оторвать
эти вывод в лог из файла который do not edit

Den
08.06.2018
07:46:23
Помогите понять для чего https://godoc.org/gopkg.in/mgo.v2#Collection.EnsureIndexKey

The
08.06.2018
07:47:36

Александр
08.06.2018
07:48:01
это следующий этап
будем делать graphql поверх restapi
отдельным прокси сервисом

Dmitri
08.06.2018
07:49:01

Александр
08.06.2018
07:49:29
в одном приложении

Dmitri
08.06.2018
07:49:52
а приложение одно?

FRD Official - Dmitriy
08.06.2018
07:49:57

Александр
08.06.2018
07:50:01
а приложение одно
но бинарников три ?

Dmitri
08.06.2018
07:50:22
и базы между ними шарятся?

Александр
08.06.2018
07:50:30
http апи, консоль "крутилка" и утилита

Google

Александр
08.06.2018
07:50:48
базы они юзают одинаковые

Dmitri
08.06.2018
07:52:07
ну, собственно, можно тупо инициализацию баз унести в отдельный package. Тупо пнул, оно отрапортовало, мол, все норм, насяльника, и можно уже к логике переходить.
заради 3 дб-коннектов сервис-провайдерами заниматься, имхо, все еще рано

Александр
08.06.2018
07:52:42
ну я и предложил тупо фабрики положить в отдельный пакет

Никита
08.06.2018
07:52:50

Александр
08.06.2018
07:53:10
Жесть
там легаси апи еще есть, их трогать нини

Dmitri
08.06.2018
07:53:39

Александр
08.06.2018
07:55:22
хотя щаз понабегут адепты
и скажут что все плохо

Admin
ERROR: S client not available

Александр
08.06.2018
07:59:22

Dmitri
08.06.2018
07:59:40
хорошая штука

Александр
08.06.2018
07:59:48
у меня прикручен github.com/sirupsen/logrus туда, не внутри же его вызвать фабрики

Dmitri
08.06.2018
08:00:14
смотри, есть такая штука, init()
если в пакадже main есть init(), оно выполнится ДО main()

Александр
08.06.2018
08:00:49
я знаю про это

Dmitri
08.06.2018
08:01:00
в нем инициализируй логгер, и норм

Александр
08.06.2018
08:01:13
я про сами вызовы

Dmitri
08.06.2018
08:01:27
а что с вызовами не так?

Google

Александр
08.06.2018
08:01:27
вот внутри фабрики db.NewMongoDb() у меня что-то сломалось

Dmitri
08.06.2018
08:01:39
тут джва путя
либо ты имеешь синглтон-логгер
который глобальный

Александр
08.06.2018
08:02:08
я либо могу внутри ее использовать logrus, либо вернуть стандартную ошибку
а потом по if вызвать уже логрус
хотя... наверно так и сделаю
параметры в main в любом случаи будут доступы (мне они нужны в консоль)

Dmitri
08.06.2018
08:03:00
либо у тебя есть type Logger interface, а сигнатура метода db.NewMongoDB(logger Logger) ...
а еще у тебя есть такая штука - именованный импорт

Александр
08.06.2018
08:03:51
не про импорты вопрос!
а про "глобальное" использование библиотек
func NewMongoDriver(host string, port int, login string, password string, database string) (*mgo.Session, error) {
....
if err != nil {
return nil, errors.New("can't connect")
}
}
а дальше в main уже обработать можно

Dmitri
08.06.2018
08:05:03
смотри, ты пишешь со стандартным логгером. У логруса сигнатура пакета с ним совпадает. Тебе тупо в начале нужных пакетов вместо import "log" нужно написать import log "путь до логруса"

Александр
08.06.2018
08:05:23

Dmitri
08.06.2018
08:05:25
можно в мейн, а можно в ней самой в лог кинуть
но вообще, да, достаточно смутная затея
короче, работа с логами - весьма отдельный философский вопрос

Александр
08.06.2018
08:06:38
для тестов надо везде юзать Dependency Injection
что бы можно было замокать либу