访问关系型数据库

本文翻译自《Accessing relational databases》。

目录

支持的数据库管理系统

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

事务

取消查询

管理连接池

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

有关Go访问数据的入门教程,请参阅教程:访问关系型数据库

Go还支持其他数据访问技术,包括用于对关系型数据库进行更高级别访问的ORM库,以及非关系型的NoSQL数据库。

  • 对象关系映射(Object-relational mapping,ORM)库。虽然database/sql包包括用于较低级别的数据访问逻辑的函数,但你也可以使用Go访问更高抽象级别的数据访问。有关Go的两个流行的对象关系映射(ORM)库的更多信息,请参阅GORM引用该包的地址)和ent引用该包的地址)。
  • NoSQL数据存储。Go社区已经为大多数NoSQL数据存储开发了驱动程序,包括MongoDBCouchbase。你可以搜索pkg.go.dev了解更多信息。

支持的数据库管理系统

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

你可以在SQLDrivers页面上找到驱动程序的完整列表。

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

database/sql包包含专门为你正在执行的数据库操作设计的函数。例如,虽然你可以使用QueryQueryRow来执行查询,但QueryRow是为只期望返回一行数据的情况而设计的,省去了返回仅包括一行数据的sql.Rows的开销。你可以使用Exec函数传入SQL语句(例如INSERTUPDATEDELETE)更改数据库。

更多信息请参考:

事务

通过sql.Tx,可以编写代码在事务中执行数据库操作。在事务中,多个操作可以一起执行并以最终提交(commit)结束,以在一个原子步骤中应用所有更改,或者回滚以所有更改。

有关事务的更多信息,请参阅执行事务

取消查询

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

对于任何数据库操作,你可以使用database/sql包里的将Context作为参数的函数。使用Context,你可以为操作指定超时时间或截止时间。你还可以使用Context通过应用程序将取消请求传播到执行SQL语句的函数,确保资源在不再需要时得到释放。 有关更多信息,请参阅取消正在进行中的数据库操作。

管理连接池

当你使用sql.DB数据库句柄时,你正在使用一个内置的连接池,该连接池根据你的代码创建和处理数据库连接。通过sql.DB的句柄是使用Go进行数据库访问的最常见方式。有关详细信息,请参阅打开一个数据库句柄

database/sql包为你管理连接池。但是,对于更高级的需求,你可以设置连接池属性,详见设置连接池属性

对于那些需要单个专用数据库连接的操作,database/sql包提供了sql.Conn。当使用sql.Tx的事务不是一个好选择时,Conn尤其有用。

例如,你的代码可能需要:

  • 通过DDL更改数据库模式,包括自身就带事务语义的逻辑。将sql包的事务函数与SQL事务语句混合是一种不良做法,如执行事务中所述。
  • 执行创建临时表等查询锁定(译者注:期间不允许执行查询语句)的操作。

有关更多信息,请参阅使用专用连接

“访问关系型数据库”的一个回复

  1. Your article gave me a lot of inspiration, I hope you can explain your point of view in more detail, because I have some doubts, thank you.

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注