|
我正在寻找一个可靠的解决方案来从 Go 连接到 MySQL 数据库。我已经看到了一些图书馆,但很难确定完整性和当前维护的不同状态。我没有复杂的需求,但我想知道人们依赖什么或连接 MySQL 最标准的解决方案是什么?; `( ~2 {. Q- |# |: d
0 l* H# C! V, c# L" E! k6 ?
解决方案:
, R# P+ u2 V% h' E' p( R 有一些驱动程序可用,但你应该只考虑实现数据库/sql API 驱动程序: y3 ?) L( d1 P0 v* {' X! d' n
它提供了干净有效的语法,% v" k4 }. w6 ]9 W" M
除了导入和连接,它确保您以后可以更改驱动程序而不更改代码。MySQL 有两个快速可靠的驱动程序:6 w: P- @) }+ B( T
我的MySQL' F. E' z* V8 z: Q p3 |0 M3 n, O7 o. g
Go-MySQL-驱动程序我已经在生产中使用了它们,程序运行了几个月,连接数百万,没有失败。
( z8 I4 H' b6 R0 o7 Ygo-wiki 上面列出了其他 SQL 数据库驱动程序。% U2 H: M- t; x* p2 [( i8 G
使用 MyMySQL 时导入:
7 m+ q8 X7 Y, `. [- himport ( "database/sql" _ "github.com/ziutek/mymysql/godrv")$ E+ J: u1 F W5 Y9 v
使用 Go-MySQL-Driver 时导入:
0 {8 [7 p- K# j" ]8 {6 ?4 N3 K. |3 Limport "database/sql" _ "github.com/go-sql-driver/mysql")- F9 m R1 i+ y# i+ t0 b
使用 MyMySQL 连接与关闭:
& H7 a- C* N/ econ,err := sql.Open("mymysql",database "/" user "/" password)defer con.Close()// here you can use the connection,it will be closed when function returns
! ^8 m0 G" f$ s9 C2 ^ 使用 Go-MySQL-Driver 连接与关闭:
& r; ]$ e$ S, K* [) |( Wcon,err := sql.Open("mysql",store.user ":" store.password "@/" store.database)defer con.Close()
! m4 Y4 j1 J8 k2 P9 z! S 选择一行:9 v' V9 o' @3 `' A9 u3 p6 X
row := con.QueryRow("select mdpr,x,y,z from sometable where id=?",id)cb := new(SomeThing)err := row.Scan(&cb.Mdpr,&cb.X,&cb.Y,&cb.Z)& l5 X9 e# w# S/ [7 Y& O+ n" J
选择多行并构建一个包含结果的数组:( M5 ?/ |" B% ^- B) s9 o$ J4 Y
rows,err := con.Query("select a,b from item where p1=? and p2=?",p1,p2)if err != nil { /* error handling */}items := make([]*SomeStruct,0,10)var ida,idb uintfor rows.Next() err = rows.Scan(&ida,&idb) if err != nil { /* error handling * items = append(items,&SomeStruct{ida,idb})}& v/ {2 t- j, ~( ~ f+ R+ f2 S
插入 :
+ |3 [' R7 Y' p0 p; A* w6 ]_,err = con.Exec("insert into tbl (id,mdpr,isok) values ",id,mdpr). K3 u/ b9 M; I1 c9 @" u) f: B
在 Go 中使用 MySQL 是一种愉快的体验:我从来没有当我遇到问题时,我的服务器已经运行了好几个月没有错误或泄漏了。大多数函数只使用可变参数,这减少了许多语言中无聊的任务。0 ]3 T1 Q3 W. w$ ^& U7 C6 c* h
请注意,如果您将来需要使用另一个 MySQL 驱动程序,您只需更改一个 go 文件中的两行:执行导入和打开连接。 |
|