✙ Egor ✙
Зачем там Go?
ainu
https://github.com/olebedev/go-starter-kit
ainu
клиент и сервер в разных директориях, их можно независимо в разных репах держать
ainu
Зачем там Go?
Чтобы деплоить легко. GO всяко удобнее чем node.js
✙ Egor ✙
Ну такое. Я бы отдельный контейнер с сервер сайд рендериногом сделал
✙ Egor ✙
А не пихал бы это в сервер
✙ Egor ✙
Чисто мое имхо
🄽🄸🄺🄸🅃🄰
Привет всем. Подскажите как лучше? В сервисе был код который вынесен в отдельный пакет. В нем есть sql файлик. Раньше он в рантайме грузился по указанному пути , который указывал на директорию в в контенере. Тобишь клали бинарник и рядом файлик sql.
Сейчас это относится к пакету. Пробую в пакете в методе init вызывать этот файл. Таких пакетов несколько разных. Они используются не вместе и исключают друг друга. Как правильно подгружать sql файл из подключенного пакета?
🄽🄸🄺🄸🅃🄰
тип файла любой, тут не важно
Anonymous
🄽🄸🄺🄸🅃🄰
вопрос про директорию как и куда
Pawel
Go+Vue я не видел. Но и видеть не хочу.
правильно, Писать что-то серьезное на нетипизированном языке — нельзя. Как следствие, все фреймворки со своими шаблонами типа vue — сразу выкидываются в помойку, без попыток в них разобраться. Отсюда и любовь всех тупорых похапэшников к vue
Anonymous
Anonymous
Так?
🄽🄸🄺🄸🅃🄰
из общей логики вычленены "модели данных" и вынесены в отдельный пакет, который можно заменить теперь другим пакетом моделей, которые реализуют такой же интерфейс. У каждого пакета моделей свой sql файлик и подключение к БД.
А делаю так :
var DatabaseClient *sqlx.DB
var sqlSource *dotsql.DotSql
func init(){
var requestFileErr error
sqlSource, requestFileErr = dotsql.LoadFromFile("/app/assets/requests.sql")
if requestFileErr != nil {
logrus.Printf("Loading sql file failed: %s", requestFileErr.Error())
}
sqlx.NameMapper = func(s string) string { return s }
var mysqlErr error
DatabaseClient, mysqlErr = sqlx.Open("mysql", mysqlUser+":"+mysqlPassWord+"@tcp("+mysqlHost+")/"+mysqlDatabase+"?charset=utf8")
if mysqlErr != nil {
logrus.Printf("Connecting to database storage failed : %s", mysqlErr.Error())
}
DatabaseClient.SetConnMaxLifetime(time.Hour * 2)
DatabaseClient.SetMaxOpenConns(100)
}
🄽🄸🄺🄸🅃🄰
сейчас указан путь в
app/assets/request.sql
потому что я вручную уже туда переложил для проверки при сборке контейнера. Да он найдет и подгружен успешно. Но хочу разобраться как его цеплять из самого пакета с моделями, или как его класть из пакета в контейнер Docker при сборке
Anonymous
Оу, докер, тут я отчаливаю 😄
🄽🄸🄺🄸🅃🄰
🄽🄸🄺🄸🅃🄰
как подгрузить файл который вызывается не в основной программе а в пакете
Alexander
🄽🄸🄺🄸🅃🄰
там как надо путь указывать или класть файл. Там же LoadFromFile берет абсолютный путь
Alexander
при сборке
Andrei 🦉
а в чем проблема передавать пакету путь до файла при инициализации приложения, например, из env и хранить файл где хочешь?
Andrei 🦉
не совсем понимаю в чем смысл держать не go'шный файл внутри пакета
Daniel
коллега, опишите задачу человеческим языком. зачем вам этот файл?
Andrei 🦉
+1
🄽🄸🄺🄸🅃🄰
🄽🄸🄺🄸🅃🄰
Был сервис у которого было N количество моделей (структур данных) данные которых грузятся из БД. Появилось несколько сервисов, которым нужны были эти же модели. Модели вынесены в отдельный пакет и должны использоваться несколькими сервисами. На этом этапе, код sql запросов уже вынесен из кода Go в отдельный файлик и подгружается в рантайме. В продолжение прошлого примера кода рядом выше приведу пример использования в коде , где уже читается часть sql файла :
var modelData []AcsiRow
request, _ := sqlSource.Raw("get-AcsiModel-data")
dbErr := DatabaseClient.Select(&modelData, request, date, date, date)
лежит с пакетом моделей. Так как допускается что потребуется в целом все модели подменить другими структурами, и остальные сервисы потребители смогут корректно работать. Есть алгоритм по которому при запуске сервисов подгружался файл sql запросов, подключались клиенты бд и кешей, и все работало.
Сейчас пытаюс решить как лучше или правильнее хранить эти sql файлы, по 1 на пакет, и правильно их запускать/подгружать при запуске кода.
Andrei 🦉
подменять планируется в рантайме или загрузка проиходит единовременно при старте приложения?
Andrei 🦉
в таком случае с моей точки зрения проще всего все таки обернуть sql запросы в гошную структуру, описать интерфейс этой обертки и при инициализации пакета с моделями явно указывать, какую структуру мы хотим использовать
Andrei 🦉
нужно поменять запросы - рядом делаем еще один файл со структурой с тем же интерфейсом, но с другим sql и в main подключаем уже его
🄽🄸🄺🄸🅃🄰
🄽🄸🄺🄸🅃🄰
тобишь sql запросы вынесены для отдельного таска, тесты делать)
Daniel
Был сервис у которого было N количество моделей (структур данных) данные которых грузятся из БД. Появилось несколько сервисов, которым нужны были эти же модели. Модели вынесены в отдельный пакет и должны использоваться несколькими сервисами. На этом этапе, код sql запросов уже вынесен из кода Go в отдельный файлик и подгружается в рантайме. В продолжение прошлого примера кода рядом выше приведу пример использования в коде , где уже читается часть sql файла :
var modelData []AcsiRow
request, _ := sqlSource.Raw("get-AcsiModel-data")
dbErr := DatabaseClient.Select(&modelData, request, date, date, date)
лежит с пакетом моделей. Так как допускается что потребуется в целом все модели подменить другими структурами, и остальные сервисы потребители смогут корректно работать. Есть алгоритм по которому при запуске сервисов подгружался файл sql запросов, подключались клиенты бд и кешей, и все работало.
Сейчас пытаюс решить как лучше или правильнее хранить эти sql файлы, по 1 на пакет, и правильно их запускать/подгружать при запуске кода.
растащить sql запросы по отдельным файлам, собрать их в go код с помощью go-bindata, использовать средства go-bindata для доступа к соответствующим переменным
🄽🄸🄺🄸🅃🄰
Daniel
так я не предлагаю их в go-код обратно сложить
Daniel
я предлагаю go-код собирать из sql файлов с помощью go generate
Daniel
ну - я так делаю
🄽🄸🄺🄸🅃🄰
очень нужно для дргогог таска с этими же сервисами
Daniel
🏁Александр
Вопрос, если я передам ссылку в функцию, потом внутри передам в эту ссылку - ссылку на значение в бд например. Оно же будет пустое на выходе?
🏁Александр
func fill(modelField *string) {
value := db.GetAttributeValue("blabla")
if value != "" {
modelField = &value
}
}
Лёша
Здравствуйте, если кто-нибудь юзает boltdb и может дать совет по поводу правильной архитектуры, напишите, пожалуйста, в лс
Alexander
а пишите прямо здесь, мне тоже интересно
Dmitry
Подскажите плз, почему это работает не как я ожидаю))
https://play.golang.org/p/cP0HL_V6IV
Dmitry
Vasily
https://s.mail.ru/LJXP/jHEkCeXWD
Vasily
метод по значению
в него приходит копия структуры и результат наружу не уходит
надо сделать метод по указателю
Vasily
func (t *Model) ...
Лёша
а пишите прямо здесь, мне тоже интересно
Хорошо. Просто интересно, как правильно нужно написать логику, чтобы была возможность писать тесты. То-есть есть какие-то функции, которые сохраняют модели в бд, но во время тестов должна использоваться тестовая бд.
Я сделал так:
1. Есть глобальная переменная dbMode и две константы - normalMode и testMode. В init() dbMode = normalMode
2. Есть функция connectDB, которая смотрит на текущий dbMode и в зависимости от него возвращает бд (для тестов или для продакшена).
3. Функции для работы с моделями получают бд с помощью connectDB()
4. Во время тестов делаю dbMode = testMode и все, используется тестовая бд.
Вот мне и интересно, насколько это ужасно
Andrei 🦉
а в чем смысл разделения базы на тестовую и прод, если она встроенная?
Лёша
про прод - я преувеличил, небольшое приложение для себя, хотя какая разница
а как иначе? зачем мне в моей основной бд левые данные из тестов?
Лёша
или вы про разные бакеты?
Andrei 🦉
ну как правило для тестов используется отдельная бд, которая сетапится при инициализации и дропается по завершению тестов
Лёша
файл с тестовой бд удаляется после тестов.
Andrei 🦉
я немного не про это, коду незачем знать тестовая у нас база или прод
можно вынести путь до файла с базой в конфигурацию и во время тестов подменять путь
Andrei 🦉
исключив всю эту ненужную логику с маршрутизацией между базами
🏁Александр
https://play.golang.org/p/Lekvya0NRs
🏁Александр
цените
🏁Александр
блин какое то извращение
🄽🄸🄺🄸🅃🄰
Пока решил кейс подгрузкой нужной версии пакета через govendor в Makefile, при сборке, и копированием файла в тело контейнера.
🄽🄸🄺🄸🅃🄰
Но с кодогенерацией предстоит разобраться в любом случае
Andrei 🦉
Лёша
Pawel
Как узнать название страны ПО РУССКИ по её коду ISO-3166-1 ? Я нашёл несколько подобных либ, но все они в международной и английской локали. вот например
https://github.com/pariz/gountries
Pawel
есть пдф-ка https://www.ifap.ru/library/gost/7672003.pdf, но не парсить же её в конце концов ради такой фигни
Lee
Pawel
эт да, но мож у кого готовое есть. лень же
Вольти
https://www.iso.org/obp/ui/#search/code/
Вольти
Краулером содрать
Lee