访问关系型数据库
4 分钟阅读
Accessing relational databases - 访问关系型数据库
使用 Go,您可以将各种数据库和数据访问方法纳入您的应用程序中。本节的主题描述了如何使用标准库的database/sql包来访问关系型数据库。
关于Go的数据访问的介绍性教程,请看 Tutorial: Accessing a relational database。
Go 也支持其他数据访问技术,包括用于更高级别的访问关系型数据库的 ORM 库,以及非关系型 NoSQL 数据存储。
- 对象-关系映射(ORM)库(Object-relational mapping (ORM) libraries)。虽然
database/sql
包包括用于低级数据访问逻辑的函数,但您也可以使用 Go 来访问更高抽象级别的数据存储。关于Go的两个流行的对象-关系映射(ORM)库的更多信息,请参见GORM和ent (package reference)。 - NoSQL 数据存储. Go 社区已经为大多数 NoSQL 数据存储开发了驱动程序,包括 MongoDB和 Couchbase。您可以搜索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 (使用专用连接)。