访问关系型数据库
使用 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
进行事务处理不合适时特别有用。
例如,你的代码可能需要
- 通过 DDL(包括包含其自身事务语义的逻辑)进行架构更改。如 执行事务 中所述,将
sql
包事务函数与 SQL 事务语句混合是一种糟糕的做法。 - 执行创建临时表的查询锁定操作。
更多信息,请参阅 使用专用连接。