• В каких случаях использовать импортируемые поля в структуре go?

    yellow79
    @yellow79
    Senior Software Engineer
    Что бы передавать данные в другие пакеты, которые ничего не знают о ваших геттерах/сеттерах =)
    Например encoding/json
    Ответ написан
    Комментировать
  • В каких случаях использовать импортируемые поля в структуре go?

    @calculator212
    Я слышал, что желательно делать поля неимпортируемыми и использовать геттеры и сеттеры
    А где слышали?Вообще это не всегда верно, например даже стандартная библиотека для работы с csv там можно настраивать поля напрямую. В целом если у вас поля с простыми типами данных то в целом это не имеет особого смысла. Это имеет смысл если нужно работать с интерфейса или спрятать за ними часть сложной логики. Насколько я знаю эти идеи тащат люди из других языков, но паттерны которые распространены в Java или C# не всегда подходят для го поэтому не стоит все буквально воспринимать.
    На редите есть обсуждение этого вопроса тут.
    Ответ написан
    2 комментария
  • Как правильно запускать хранимые процедуры?

    uvelichitel
    @uvelichitel Куратор тега Go
    habrahabr.ru/users/uvelichitel
    О каких хранимках идёт речь?
    В postgres есть собственная метафора хранимок, скомпилированных и живущих на postgres сервере. В Go пакет стандартной библиотеки sql сделан кросс-sql-движковым и ближайший аналог это sql.Stmt https://pkg.go.dev/database/sql#Stmt (в документации есть примеры кода). Вы можете скомпилировать sql стейтмент единожды в контексте соединения или транзакции и использовать многократно и потоко-безопасно пока жив контекст. Это даёт выигрыш в производительности.
    Если я правильно вопрос)
    Наивный код
    script, err := ioutil.ReadFile("path/to/procedure.sql")
    if err != nil {
        log.Fprintf(os.Stderr, "Error reading SQL script file: %v\n", err)
    }
    stmt, err := db.PrepareContext(context.Background(), string(script)) //компилируем стейтмент как шаблон c плейсхолдерами аргументов
    if err != nil {
    	log.Fatal(err)
    }
    _, err = stmt.ExecContext(ctx, args) //применяем стейтмент к аргументам args... в контексте ctx
    if err != nil {
        log.Fprintf(os.Stderr, "Error executing SQL script: %v\n", err)
    }

    Шаблон (path/to/procedure.sql) может выглядеть так
    SELECT username FROM users WHERE id = ?
    Вопросительный знак ? это плейсхолдер для аргумента
    Ответ написан
    1 комментарий
  • Как правильно запускать хранимые процедуры?

    nikonor
    @nikonor
    Программист go, perl
    либо добавить if not exists, но лучше почитать про goose (https://github.com/pressly/goose)
    Ответ написан
    3 комментария
  • Как правильно запускать хранимые процедуры?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Обычно в проекте заводят отдельный модуль. Версионный контроль для БД. Можно на базе
    liquibase или flyway. Можно на базе каких-то Go-технологий.

    Но суть такова. Хранимка устанавливается синхронно с обновлением версии комплекса. Как
    часть установочного pipeline. И далее из кода ты ее просто вызываешь по имени.
    Ответ написан
    Комментировать