@proGO

Страница 1494 из 1674
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)

ну CRUD может и не хватить
а вот чо ты от своего дао хочешь - это исключительно твой головняк

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

Александр
08.06.2018
07:48:01
это следующий этап

будем делать graphql поверх restapi

отдельным прокси сервисом

Dmitri
08.06.2018
07:49:01
зачем в мейне вообще вы это делаете все?
если у приложухи одно соединение с одной конкретной базой данных - почему бы и нет? Не городить же serviceProvider заради одной записи?

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
Жесть
там легаси апи еще есть, их трогать нини

Александр
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 "путь до логруса"

Dmitri
08.06.2018
08:05:25
можно в мейн, а можно в ней самой в лог кинуть

сама идея писать в лог из пакета - утопична
зато хорошо сказывается на всяческих импортах и автотестах, например...

но вообще, да, достаточно смутная затея

короче, работа с логами - весьма отдельный философский вопрос

Александр
08.06.2018
08:06:38
для тестов надо везде юзать Dependency Injection

что бы можно было замокать либу

Страница 1494 из 1674