访问关系数据库
使用 Go,您可以将各种数据库和数据访问方法合并到您的应用程序中。本节中的主题描述了如何使用标准库的database/sql
包来访问关系数据库。
有关使用 Go 进行数据访问的介绍性教程,请参阅 教程:访问关系数据库。
Go 还支持其他数据访问技术,包括用于对关系数据库进行更高级别访问的 ORM 库,以及非关系 NoSQL 数据存储。
- 对象关系映射 (ORM) 库. 虽然
database/sql
包包含用于较低级别数据访问逻辑的函数,但您也可以使用 Go 在较高抽象级别访问数据存储。有关 Go 的两个流行的对象关系映射 (ORM) 库的更多信息,请参阅 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
,例如当客户端的连接关闭或操作运行时间超过您希望的时间时.
对于任何数据库操作,您都可以使用将Context
作为参数的 database/sql
包函数。使用Context
,您可以指定操作的超时或截止时间。您还可以使用 Context
将取消请求通过应用程序传播到执行 SQL 语句的函数,从而确保在不再需要资源时释放资源.
有关更多信息,请参阅取消正在进行的操作。
托管连接池
当您使用sql.DB
数据库句柄时,您将使用内置连接池进行连接,该连接池会根据您的代码需要创建和释放连接。句柄通过sql.DB
是使用 Go 进行数据库访问的最常见方式。有关更多信息,请参阅打开数据库句柄 。
database/sql
包将为您管理连接池。但是,对于更高级的需求,可以按照设置连接池属性中所述设置连接池属性。
对于那些需要单个保留连接的操作,database/sql
包提供了sql.Conn
.Conn
当事务用sql.Tx
是一个糟糕的选择时特别有用(Conn is especially useful when a transaction with sql.Tx would be a poor choice.)。
例如,您的代码可能需要:
- 通过 DDL 进行schema更改,包括包含其自己的事务语义的逻辑。将
sql
包事务函数与 SQL 事务语句混合使用是一种糟糕的做法,如执行事务中所述。 - 执行创建临时表的查询锁定操作.
有关更多信息,请参阅使用专用连接.