Доступ к реляционным базам данных

Используя Go, вы можете интегрировать в свои приложения широкий спектр баз данных и подходов к доступу к данным. В данном разделе описываются способы использования стандартной библиотеки пакета database/sql для доступа к реляционным базам данных.

Для ознакомительного руководства по доступу к данным с использованием Go, пожалуйста, ознакомьтесь с руководством: Доступ к реляционной базе данных.

Go также поддерживает и другие технологии доступа к данным, включая библиотеки ORM для более высокого уровня абстракции при работе с реляционными базами данных, а также нетипизированные (NoSQL) хранилища данных.

  • Объектно-реляционное отображение (ORM) библиотеки. Хотя пакет database/sql включает функции для реализации логики доступа к данным на более низком уровне, вы также можете использовать Go для работы с хранилищами данных на более высоком уровне абстракции. Подробнее о двух популярных библиотеках ORM для Go см. на страницах GORM (ссылка на пакет) и ent (ссылка на пакет).
  • NoSQL хранилища данных. Сообщество Go разработало драйверы для большинства NoSQL хранилищ данных, включая MongoDB и Couchbase. Вы можете выполнить поиск на pkg.go.dev для получения дополнительной информации.

Поддерживаемые системы управления базами данных

Go поддерживает все наиболее распространённые системы управления реляционными базами данных, включая MySQL, Oracle, Postgres, SQL Server, SQLite и другие.

Полный список драйверов можно найти на странице SQLDrivers.

Функции для выполнения запросов или внесения изменений в базу данных

Пакет database/sql включает функции, специально предназначенные для типа выполняемой операции с базой данных. Например, хотя вы можете использовать Query или QueryRow для выполнения запросов, QueryRow предназначен для случаев, когда ожидается только одна строка результата, минуя накладные расходы, связанные с возвратом объекта sql.Rows, который содержит лишь одну строку. Вы можете использовать функцию Exec для внесения изменений в базу данных с помощью SQL-выражений, таких как INSERT, UPDATE или DELETE.

Для получения дополнительной информации см. следующее:

Транзакции

С помощью sql.Tx можно написать код для выполнения операций с базой данных в рамках транзакции. В транзакции можно выполнить несколько операций вместе и завершить их либо финальным коммитом, чтобы применить все изменения за один атомарный шаг, либо откатом, чтобы отменить их.

Для получения дополнительной информации о транзакциях см. Выполнение транзакций.

Отмена запросов

Вы можете использовать context.Context, если требуется возможность отмены операции с базой данных, например, при закрытии соединения с клиентом или если операция выполняется дольше, чем ожидалось.

Для любой операции с базой данных вы можете использовать функцию из пакета database/sql, которая принимает Context в качестве аргумента. С помощью Context вы можете задать таймаут или срок выполнения операции. Также вы можете использовать Context для распространения запроса на отмену через ваше приложение до функции, выполняющей SQL-запрос, что гарантирует освобождение ресурсов, если они больше не требуются.

Более подробную информацию см. в разделе Отмена выполняющихся операций.

Управляемая пул connection

Когда вы используете дескриптор базы данных sql.DB, вы подключаетесь с использованием встроенного пула соединений, который создает и освобождает соединения в соответствии с потребностями вашего кода. Дескриптор через sql.DB — наиболее распространённый способ доступа к базе данных в Go. Более подробную информацию см. в разделе Открытие дескриптора базы данных.

Пакет database/sql управляет пулом соединений за вас. Однако, для более сложных случаев вы можете установить свойства пула соединений, как описано в разделе Настройка свойств пула соединений.

Для операций, в которых требуется одно зарезервированное соединение, пакет database/sql предоставляет sql.Conn. Conn особенно полезен, когда использование транзакции с sql.Tx является нецелесообразным.

Например, ваш код может потребоваться:

  • Выполняйте изменения схемы с помощью DDL, включая логику, которая содержит собственные семантики транзакций. Смешивание функций транзакций пакета sql с SQL-инструкциями транзакций является плохой практикой, как описано в разделе Выполнение транзакций.

  • Выполняйте операции блокировки запросов, создающие временные таблицы.

Для дополнительной информации см. Использование выделенных соединений.

GoRu.dev Golang на русском

На сайте представлена адаптированная под русский язык документация языка программирования Golang