本文翻译自《Accessing relational databases》。
目录
使用Go,你可以将各种各样的数据库和数据访问方法集成到你的应用程序中。本节中的主题描述了如何使用标准库的database/sql
包来访问关系数据库。
有关Go访问数据的入门教程,请参阅教程:访问关系型数据库。
Go还支持其他数据访问技术,包括用于对关系型数据库进行更高级别访问的ORM库,以及非关系型的NoSQL数据库。
- 对象关系映射(Object-relational mapping,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
,可以编写代码在事务中执行数据库操作。在事务中,多个操作可以一起执行并以最终提交(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事务语句混合是一种不良做法,如执行事务中所述。 - 执行创建临时表等查询锁定(译者注:期间不允许执行查询语句)的操作。
有关更多信息,请参阅使用专用连接。
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.