一般来说,一个web应用肯定是离不开数据库的。通过对数据库的增删改查,足以胜任相当一部分应用场景了。
这里会介绍最基本的连接数据库和几个增删改查的例子。
驱动
mysql的驱动我使用github.com/go-sql-driver/mysql
1
| $ go get -u github.com/go-sql-driver/mysql
|
1 2 3 4
| import "database/sql" import _ "github.com/go-sql-driver/mysql"
db, err := sql.Open("mysql", "user:password@/dbname")
|
参数
初始化链接参数的时候,除了dbname,其他参数都是选填的,比如数据库没有密码,就可以不填。
比如最短的情况下可以是
如果你不想预先选择数据库,甚至可以:
密码
密码支持任何字符,所以也不需要转义
协议
一般情况下可以选择unix 套接字或者是tcp。
地址
对于tcp和udp连接类型,使用host[: port]这种格式,如果不填port,则会使用默认端口3306,如果host是ipv6类型,必须用方括号括起来,函数net.JoinHostPort和net.SplitHostPort以这种形式处理地址。
对于Unix 套接字,地址是MySQL服务器套接字的绝对路径,例如/var/run/mysqld/mysqld.sock或/tmp/mysql.sock。
参数
参数是区分大小写的!
这部分内容比较多,且不常用,本篇文章的重点不在于介绍这个mysql库,所以就不再赘述。
用法
这里简单介绍一下增删改查等常见用法。
首先,假设我们有一个数据库,test01,有一张数据表 user。
表结构:
1 2 3 4 5
| create table user ( id INT(10) NOT NULL AUTO_INCREMENT, username varchar(10) not null, pw varchar(20) not null );
|
增删改查例子
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
| package main import "database/sql" import _ "github.com/go-sql-driver/mysql"
func main() { db, err := sql.Open("mysql", "user:password@/dbname") if err != nil { panic(err.Error()) } defer db.Close()
err = db.Ping() if err != nil { panic(err.Error()) }
stmtIns, err := db.Prepare("insert into user values( ?, ? )") if err != nil { panic(err.Error()) } defer stmtIns.Close()
stmtOut, err := db.Prepare("select username from user where id = ?") if err != nil { panic(err.Error()) } defer stmtOut.Close()
for i := 0; i < 25; i++ { _, err = stmtIns.Exec(i, 'testname') if err != nil { panic(err.Error()) } }
var username string
err = stmtOut.QueryRow(13).Scan(&username) if err != nil { panic(err.Error()) } fmt.Printf("The username is: %s", username)
stmtDel, err = db.Prepare("delete from user where id = ?") if err != nil { panic(err.Error()) } defer stmtDel.Close() res, err = stmtDel.Exec(12) if err != nil { panic(err.Error()) } affect, err = res.RowsAffected() if err != nil { panic(err.Error()) } fmt.Println(affect) }
|
这样就完成了几个最基本的增删改查的操作。非常的简单。
Prepare函数是不直接执行的,要等到调用Exec()函数才会真正执行操作。
下一篇会介绍基本的redis操作。