Go 中提供了 database/sql
包来操作数据库,不过需要下载相应的数据库驱动才可以使用。
下载 Mysql 驱动
1 $ go get github.com/go-sql-driver/mysql
引入包
1 2 3 4 5 6 import ( "fmt" "database/sql" _ "github.com/go-sql-driver/mysql" )
因为驱动我们并没有在代码中直接使用,所以使用 _
导入方式
创建连接
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 const ( User = "root" Passwd = "wxnacy" Host = "127.0.0.1" Port = 3306 Database = "study" ) func Connect () (*sql.DB, error) { url := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4" , User, Passwd, Host, Port, Database) DB, err := sql.Open("mysql" , url) //第一个参数为驱动名 if err != nil { return nil , err } //设置数据库最大连接数 DB.SetConnMaxLifetime(100 ) //设置上数据库最大闲置连接数 DB.SetMaxIdleConns(10 ) //验证连接 if err := DB.Ping(); err != nil { fmt.Println("Connect fail" ) return nil , err } fmt.Println("Connect success" ) return DB, nil }
插入数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 func Insert (db *sql.DB, name string ) (int64 , error) { // 准备 sql 语句 stmt, err := db.Prepare("insert into book (name) values (?)" ) defer stmt.Close() if err != nil { return 0 , err } // 插入参数并执行语句 res, err := stmt.Exec(name) if err != nil { return 0 , err } // 最后插入的 id id, err := res.LastInsertId() if err != nil { return 0 , err } return id, nil }
使用事务
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 func InsertTx (db *sql.DB, name string ) (int64 , error) { // 开启事务 tx, err := db.Begin() if err != nil { return 0 , err } // 准备 sql 语句 stmt, err := tx.Prepare("insert into book (name) values (?)" ) defer stmt.Close() if err != nil { return 0 , err } // 插入参数并执行语句 res, err := stmt.Exec(name) if err != nil { // 出错时回滚 if rollbackErr := tx.Rollback(); rollbackErr != nil { return 0 , rollbackErr } return 0 , err } // 提交 if commitErr := tx.Commit(); commitErr != nil { return 0 , commitErr } // 最后插入的 id id, err := res.LastInsertId() if err != nil { return 0 , err } return id, nil }
查询
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 type Book struct { Id int64 Name string } func QueryById (db *sql.DB, id int64 ) { var b Book err := db.QueryRow("select * from book where id = ?" , id).Scan(&b.Id, &b.Name) checkErr(err) fmt.Println(b.Id, b.Name) } func Query (db *sql.DB) { rows, err := db.Query("select * from book" ) checkErr(err) defer rows.Close() books := make ([]Book, 0 ) for rows.Next() { var b Book rows.Scan(&b.Id, &b.Name) books = append (books, b) } fmt.Println(books) }
修改
1 2 3 4 5 6 7 8 9 10 11 12 func Update (db *sql.DB, id int64 ) error { stmt, err := db.Prepare("update book set name = ? where id = ?" ) defer stmt.Close() if err != nil { return err } _, err = stmt.Exec("update-name" , id) if err != nil { return err } return nil }
删除
1 2 3 4 5 6 7 8 9 10 11 12 func DeleteById (db *sql.DB, id int64 ) error { stmt, err := db.Prepare("delete from book where id = ?" ) defer stmt.Close() if err != nil { return err } _, err = stmt.Exec(id) if err != nil { return err } return nil }
完整代码见demo