欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Golang中如何对MySQL进行操作详解

程序员文章站 2022-03-06 09:06:08
前言 golang官方并没有提供数据库驱动,但通过database/sql/driver包来提供了实现驱动的标准接口。可以在github上找到很多开源的驱动。 其中...

前言

golang官方并没有提供数据库驱动,但通过database/sql/driver包来提供了实现驱动的标准接口。可以在github上找到很多开源的驱动。

其中go-sql-driver/mysql是一个比较推荐的驱动,其完全支持database/sql接口。

使用这个驱动, 在项目里import进:

import (
 "database/sql"
 _ "github.com/go-sql-driver/mysql"
)

在正式使用database/sql包之前,首先得明白sql.db并不代表一个数据库连接,它并不会与数据库建立任何连接,也不会验证参数的合法性,要想知道dsn的合法性,需使用sql.db实例(比如db)db.ping() 方法, 如下:

err = db.ping()
if err != nil {
 // 错误处理
}

使用sql.open()方法即可获得一个sql.db实例。需要注意的是,sql.db的设计就是用来作为长连接使用的,不应该在项目里频繁的进行open()与close(),提倡的做法是声明一个全局的sql.db实例, 将其复用起来。即只open()一次,使用直到程序结束任务。

拿到sql.db实例之后,就可以对数据库进行操作了。

在操作数据库时,推荐做法是使用db.prepare()对sql语句进行预编译,这样具有较高的安全性,可在一定程度上避免诸如sql注入这样的攻击手段。

一些示例:

/*
 查询操作
*/
stmt, err := db.prepare("select `user_name` from `users` where `id` = ?")
defer stmt.close()
if err != nil {
 //错误处理
}
var username string
//scan() 将结果复制到username
err = stmt.queryrow(1).scan(&username)

fmt.println(username)

/*
 多行结果
*/
stmt, err := db.prepare("select `user_name` from `users` where `age` = ?")
defer stmt.close()
if err != nil {
 //错误处理
}

rows, err := stmt.query(年龄)
if err != nil {
 //错误处理
}

for rows.next() {
 var username string
 if err := rows.scan(&username); err != nil {
  //错误处理
 }
}
/*
 插入操作
*/
stmt, err := db.prepare("insert into `users` (`user_name`, `age`) values(?, ?)")
defer stmt.close()
if err != nil {
 //错误处理
}
stmt.exec("名字",年龄)
/*
 事务
*/
tx, err := db.begin()
if err != nil {
 //错误处理
}
defer tx.rollback()

stmt, err := db.prepare("")
defer stmt.close()
if err != nil {
 //错误处理
}

stmt.exec()
err = tx.commit()
if err != nil {
 //错误处理
}

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对的支持。