Доступ к реляционным базам данных
Используя 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 можно написать код для выполнения операций с базой данных в транзакции. В транзакции можно выполнить несколько операций вместе и завершить их финальной операцией commit, чтобы применить все изменения за один атомарный шаг, или rollback, чтобы отменить их.
Для получения дополнительной информации о транзакциях см. Выполнение транзакций.
Отмена запросов
Можно использовать context.Context, если требуется возможность отмены операции с базой данных, например, когда закрывается соединение с клиентом или операция выполняется дольше, чем планировалось.
Для любой операции с базой данных можно использовать функцию пакета database/sql, которая принимает Context в качестве аргумента. Используя Context, можно указать таймаут или срок окончания для операции. Также можно использовать Context для распространения запроса на отмену через приложение до функции, выполняющей SQL-инструкцию, что гарантирует освобождение ресурсов, если они больше не требуются.
Для получения дополнительной информации см. Отмена выполняющихся операций.
Управляемая пул коннектов
Когда используется дескриптор базы данных sql.DB, вы подключаетесь с использованием встроенного пула соединений, который создает и освобождает соединения в соответствии с потребностями вашего кода. Дескриптор через sql.DB — наиболее распространенный способ доступа к базе данных в Go. Для получения дополнительной информации см. Открытие дескриптора базы данных.
Пакет database/sql управляет пулом соединений за вас. Однако, для более сложных потребностей можно установить свойства пула соединений, как описано в Установка свойств пула соединений.
Для операций, в которых требуется одно зарезервированное соединение, пакет database/sql предоставляет sql.Conn.
Conn особенно полезен, когда использование транзакции с sql.Tx является плохим выбором.
Например, ваш код может потребоваться:
- Выполнять изменения схемы через DDL, включая логику, содержащую собственные транзакционные семантики. Смешивание функций транзакций пакета
sqlс SQL-инструкциями транзакций является плохой практикой, как описано в Выполнение транзакций. - Выполнять операции блокировки запросов, создающие временные таблицы.
Для получения дополнительной информации см. Использование выделенных соединений.