访问关系数据库
使用 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
。当使用 sql.Tx
进行事务处理不合适时,Conn
尤其有用。
例如,您的代码可能需要
- 通过 DDL 进行模式更改,包括包含自身事务语义的逻辑。混合使用
sql
包的事务函数和 SQL 事务语句是一种不良做法,如 执行事务 中所述。 - 执行创建临时表的查询锁定操作。
更多信息,请参阅 使用专用连接。