访问关系型数据库

Accessing relational databases - 访问关系型数据库

原文:https://go.dev/doc/database/

​ 使用 Go,您可以将各种数据库和数据访问方法纳入您的应用程序中。本节的主题描述了如何使用标准库的database/sql包来访问关系型数据库。

​ 关于Go的数据访问的介绍性教程,请看 Tutorial: Accessing a relational database

​ Go 也支持其他数据访问技术,包括用于更高级别的访问关系型数据库的 ORM 库,以及非关系型 NoSQL 数据存储。

  • 对象-关系映射(ORM)库(Object-relational mapping (ORM) libraries)。虽然database/sql 包包括用于低级数据访问逻辑的函数,但您也可以使用 Go 来访问更高抽象级别的数据存储。关于Go的两个流行的对象-关系映射(ORM)库的更多信息,请参见GORMent (package reference)。
  • NoSQL 数据存储. Go 社区已经为大多数 NoSQL 数据存储开发了驱动程序,包括 MongoDBCouchbase。您可以搜索pkg.go.dev 获取更多信息。

支持的数据库管理系统

​ Go supports all of the most common relational database management systems, including MySQL, Oracle, Postgres, SQL Server, SQLite, and more.

​ Go支持所有最常见的关系型数据库管理系统,包括MySQL、Oracle、Postgres、SQL Server、SQLite等等。

​ 您可以在 SQLDrivers页面找到完整的驱动列表。

执行查询或更改数据库的函数

database/sql包包含专门为您正在执行的数据库操作设计的函数。例如,虽然您可以使用Query方法或QueryRow方法来执行查询,但QueryRow方法是为只需要一行的情况而设计的,省去了返回只包括一行记录的sql.Rows的开销。您可以使用Exec方法用SQL语句对数据库进行修改,如INSERT, UPDATE, 或DELETE

​ 更多内容,请参见以下内容:

事务

​ 通过sql.Tx,您可以编写代码来执行事务中的数据库操作。在一个事务中,多个操作可以一起执行,并以最后的提交(commit)来结束,以便在一个原子步骤中应用所有的更改,或者以回滚(rollback)来丢弃(discard )它们。

​ 关于事务的更多信息,请参见Executing transactions (执行事务)

查询的取消

​ 当您希望能够取消一个数据库操作时,您可以使用context.Context,例如,当客户端的连接关闭或操作运行的时间超过预期时。

​ 对于任何数据库操作,您可以使用一个database/sql包方法,该函数将Context作为一个实参。使用Context,您可以为操作指定一个超时或最后期限。您还可以使用 Context 将取消请求通过应用程序传播到执行 SQL 语句的方法,确保在不再需要资源时释放资源。

​ 更多信息请参见Canceling in-progress operations (取消正在进行的操作)

管理连接池

​ 当您使用sql.DB数据库句柄时,您正在与一个内置的连接池连接,该连接池根据您代码的需要创建和处置连接。通过sql.DB的句柄是用Go进行数据库访问的最常见方式。更多信息请参见Opening a database handle (打开数据库句柄)

database/sql包为您管理连接池。然而,对于更高级的需求,可以按照Setting connection pool properties (设置连接池属性)中的说明设置连接池属性。

​ 对于那些需要单个保留连接的操作,database/sql包提供了sql.Conn。当使用sql.Tx进行事务时不合适时,Conn就特别有用。

​ 例如,您的代码可能需要:

  • 通过DDL进行模式更改,其中包含具有自己的事务语义的逻辑。将sql包事务函数与SQL事务语句混合使用是一种不好的做法,如在Executing transactions (执行事务)中所述。
  • 执行创建临时表的查询锁定操作。

​ 更多内容请参见 Using dedicated connections (使用专用连接)

最后修改 October 27, 2023: 更新 (d5ede1a)