加载驱动程序包后,就可以创建数据库对象了,一个sql.DB
。
要创建sql.DB
,请使用sql.Open()
。这将返回一个*sql.DB
:
func main() {
db, err := sql.Open("mysql",
"user:password@tcp(127.0.0.1:3306)/hello")
if err != nil {
log.Fatal(err)
}
defer db.Close()
}
在所示的示例中,我们说明了几件事:
sql.Open
的第一个参数是,驱动程序名称。这是驱动程序用来在database/sql
中进行自身注册的字符串,通常与包名称相同,以避免混淆。例如,mysql
用于 github.com/go-sql-driver/mysql 。某些驱动程序不遵循约定,而是使用数据库名称,例如,用于 github.com/mattn/go-sqlite3 的sqlite3
和用于 github.com/lib/pq 的postgres
。- 第二个参数是,特定于驱动程序的语法,它告诉驱动程序如何访问基础数据存储。在此示例中,我们将连接到本地 MySQL 服务器实例内的「hello」数据库。
- 您(几乎)应该始终检查并处理从所有
database/sql
操作返回的错误。我们将在以后讨论一些特殊情况,以解决此问题。 - 如果
sql.DB
的生存期不应超出该功能的范围,则推迟db.Close()
是习惯的做法。
也许违反直觉,sql.Open()
不会建立与数据库的任何连接,也不会验证驱动程序的连接参数。而是它只准备数据库抽象以备后用。与基础数据存储区的第一个实际连接将延迟到第一次需要时建立。如果要立即检查数据库是否可用和可访问(例如,检查是否可以建立网络连接并登录),请使用 db.Ping()
进行操作,并记录检查错误:
err = db.Ping()
if err != nil {
// do something here
}
虽然在完成后对 Close()
数据库很习惯,但是 sql.DB
对象被设计为长期存在。不要经常使用 Open()
和 Close()
。而是为每个需要访问的不同数据存储创建 一个 sql.DB
对象,并保留该对象直到程序完成对该数据存储的访问为止。根据需要传递它,或以某种方式使其在全局范围内可用,但保持打开状态。不要通过短期函数来 Open()
和 Close()
。而是将 sql.DB
传递给该短期函数作为参数。
如果不将 sql.DB
视为长期对象,则可能会遇到诸如重用和连接共享不良,可用网络资源用尽或由于很多原因而导致的偶发性故障等问题 TIME_WAIT
状态中剩余的 TCP 连接数。这些问题表明您没有使用设计的 database/sql
。
现在该使用您的 sql.DB
对象了。
转自:https://learnku.com/docs/go-database-sql/accessing/9476
最后编辑: kuteng 文档更新时间: 2021-11-19 09:18 作者:kuteng