go原生提供了連線資料庫操作的支援,在用 golang進行開發的時候,如果需要在和資料庫互動,則可以使用database/sql包。這是乙個對關係型資料庫的通用抽象,它提供了標準的、輕量的、面向行的介面。
在go中訪問資料庫需要用到sql.db介面:它可以建立語句(statement)和事務(transaction),執行查詢,獲取結果。
解釋一下匯入包名前面的"_"作用:
import 下劃線(如:import _ github/demo)的作用:當匯入乙個包時,該包下的檔案裡所有init()函式都會被執行,然而,有些時候我們並不需要把整個包都匯入進來,僅僅是是希望它執行init()函式而已。這個時候就可以使用 import _ 引用該包。
上面的mysql驅動中引入的就是mysql包中各個init()方法,你無法通過包名來呼叫包中的其他函式。匯入時,驅動的初始化函式會呼叫sql.register將自己註冊在database/sql包的全域性變數sql.drivers中,以便以後通過sql.open訪問。
執行資料庫操作之前我們準備一張表:
create table `user` (
`id` bigint(20) not null auto_increment,
`name` varchar(45) default '',
`age`int(11) not null default '0',
`***` tinyint(3) not null default '0',
`phone` varchar(45) not null default '',
primary key (`id`)
) engine=innodb auto_increment=3 default charset=utf8;
1. 初始化資料庫連線:#
db, _ := sql.open("mysql", "root:123456@tcp(127.0.0.1:3306)/test")//設定資料庫最大連線數
db.setconnmaxlifetime(100)//設定上資料庫最大閒置連線數
db.setmaxidleconns(10)//驗證連線
if err := db.ping(); err !=nil fmt.println("connnect success")
sql.open()中的資料庫連線串格式為:"使用者名稱:密碼@tcp(ip:埠)/資料庫?charset=utf8"。
db的型別為:*sql.db,有了db之後我們就可以執行crud操作。go將資料庫操作分為兩類:query與exec。兩者的區別在於前者會返回結果,而後者不會。
query表示查詢,它會從資料庫獲取查詢結果(一系列行,可能為空)。
exec表示執行語句,它不會返回行。
此外還有兩種常見的資料庫操作模式:
queryrow表示只返回一行的查詢,作為query的乙個常見特例。
prepare表示準備乙個需要多次使用的語句,供後續執行用。
2. 查詢操作#
var user user
rows, e := db.query("select * from user where id in (1,2,3)")if e ==nil forrows.next()//準備sql語句
stmt, err := tx.prepare("delete from user where id = ?")if err !=nil //設定引數以及執行sql語句
res, err := stmt.exec(user.id)if err !=nil //提交事務
tx.commit()
我們來乙個完整的sql操作:
"strings")//資料庫配置
const (
username= "root"password= "12`12`1`"ip= "127.0.0.1"port= "3308"dbname= "test")//db資料庫連線池
var db *sql.db
type user struct //注意方法名大寫,就是public
func initdb() , "")//開啟資料庫,前者是驅動名,所以要匯入: _ "github.com/go-sql-driver/mysql"
db, _ = sql.open("mysql", path)//設定資料庫最大連線數
db.setconnmaxlifetime(100)//設定上資料庫最大閒置連線數
db.setmaxidleconns(10)//驗證連線
if err := db.ping(); err !=nil fmt.println("connnect success")
}//查詢操作
func query() forrows.next() //準備sql語句
stmt, err := tx.prepare("delete from user where id = ?")if err !=nil //設定引數以及執行sql語句
res, err := stmt.exec(user.id)if err !=nil //提交事務
tx.commit()//獲得上乙個insert的id
fmt.println(res.lastinsertid())
returntrue}
func insertuser(user user)bool//準備sql語句
stmt, err := tx.prepare("insert into user (`name`, `phone`, `age`, `***`) values (?, ?, ?, ?)")if err !=nil //將引數傳遞到sql語句中並且執行
res, err :=stmt.exec(user.name, user.phone, user.age, user.***)if err !=nil //將事務提交
tx.commit()//獲得上乙個插入自增的id
fmt.println(res.lastinsertid())
returntrue}
func main()
insertuser(u)
defer db.close()
go中mysql連線 Go 連線MySQL
go操作mysql 連線go語言中的database sql包提供了保證sql或類sql資料庫的泛用介面,並不提供具體的資料庫驅動。使用database sql包時必須注入 至少 乙個資料庫驅動。我們常用的資料庫基本上都有完整的第三方實現。例如 mysql驅動 使用mysql驅動 func open...
go mysql連線 Go連線MYSQL
go原生提供了連線資料庫操作的支援,在用 golang進行開發的時候,如果需要在和資料庫互動,則可以使用database sql包。這是乙個對關係型資料庫的通用抽象,它提供了標準的 輕量的 面向行的介面。在go中訪問資料庫需要用到sql.db介面 它可以建立語句 statement 和事務 tran...
go連線mysql GO連線MySQL
go語言沒有提供官方的資料庫驅動,所以要安裝第三方函式庫。多行查詢 多行查詢db.query 執行一次查詢,返回多行結果 即rows 一般用於執行select命令。引數args表示query中的佔位引數。具體示例 查詢多條資料示例 func querymultirowdemo fmt.printf ...