Go: SQL
Теория: Работа с базой данных
Работа с базой в Go начинается с подготовки подключения. Программа вызывает sql.Open(), чтобы создать объект, который управляет пулом соединений. На этом этапе никакого реального соединения с базой ещё нет. Приложение как будто знакомится с администратором базы и получает доступ к инструментам, через которые позже установит связь. Такой подход позволяет заранее описать правила работы пула и подготовить приложение к нагрузке, прежде чем оно попробует выполнить первый запрос.
Ping и когда соединение становится реальным
После создания пула программе нужно убедиться, что база отвечает. Это делает метод Ping() или его контекстная версия PingContext(). В этот момент устанавливается первое реальное соединение: драйвер отправляет короткий запрос, и база подтверждает, что доступна. Такой шаг помогает обнаружить ошибку раньше, чем приложение начнёт выполнять рабочие операции. Если база недоступна, сервис остановится сразу, а не в середине запроса.
После проверки подключения приложение получает гарантию, что база отвечает, и теперь может настраивать работу пула под свои задачи.
Пул соединений работает как очередь из заранее подготовленных подключений. Приложение берёт из этой очереди свободное соединение, выполняет запрос и возвращает его обратно. Такой подход снижает задержки, потому что нет необходимости заново устанавливать соединение каждый раз. Когда в системе много запросов, настройки пула определяют, справится ли приложение с нагрузкой без задержек и ошибок.
Exec для изменения данных
Когда программе нужно изменить данные в таблице, она вызывает метод Exec(). Этот метод подходит для операций, которые не возвращают строк результата: вставки, обновления и удаления. Приложение передаёт SQL-запрос с плейсхолдерами, значения для них и получает объект, из которого можно узнать количество изменённых строк.
QueryRow и Scan при выборе одной строки
Когда запрос должен вернуть только одну строку, программа использует QueryRow() или QueryRowContext(). Этот метод сразу готов к считыванию результата: приложение вызывает Scan() и получает значения в переменные. Ошибка появляется именно на этапе Scan(), потому что до этого драйвер ещё не читает строку.
Query при получении нескольких строк
Когда запрос возвращает несколько строк, приложение использует Query() или QueryContext(). Эти методы открывают поток результатов: программа читает строки по одной через Next(), считывает данные вызовом Scan() и возвращает соединение в пул, когда вызывает rows.Close().


