MySQL
使用普通的 “database/sql”
package main
import (
"database/sql"
"fmt"
_ "github.com/go-sql-driver/mysql" // 必须导入这个执行里面的init()
)
// 安装MySQL驱动: go get -u github.com/go-sql-driver/mysql
var db *sql.DB // db是一个连接池对象
// 连接数据库
func initDB() (err error) {
dsn := "root:123456@tcp(127.0.0.1:3306)/remote_fix" // 用户名:密码@tcp(IP:端口)/数据库名
db, err = sql.Open("mysql", dsn) // 不会校验用户名和密码是否正确
if err != nil { // 格式不正确报错
return err
}
err = db.Ping() // 尝试和数据库建立连接
if err != nil { // 密码错误报错
return err
}
// 设置数据库连接池的最大连接数, 默认是0=无限制
db.SetMaxOpenConns(1)
// 设置数据库最大空闲连接数
db.SetMaxIdleConns(2)
return // == return nil
}
type user struct {
Username string
Nickname string
IsExpert int
}
// 单行查询
func queryRowTest() {
user := user{}
row := db.QueryRow("select username, nickname, is_expert from users limit ?", 1) // 可以挖空后面补充
// Query之后必须调用Scan方法, 该方法会释放数据库连接
_ = row.Scan(&user.Username, &user.Nickname, &user.IsExpert)
fmt.Println(user)
}
// 多行查询
func queryMultiRowsTest() {
rows, err := db.Query("select username, nickname, is_expert from users")
if err != nil {
fmt.Println("执行查询失败,", err)
return
}
defer rows.Close()
for rows.Next() {
user := user{}
_ = rows.Scan(&user.Username, &user.Nickname, &user.IsExpert)
fmt.Println(user)
}
}
func insertRow() { // 更新和删除也类似, 就是SQL语句不一样
ret, err := db.Exec("insert into users(username, nickname, is_expert) values ('us', 'nick', 1)")
if err != nil {
fmt.Println("插入失败", err)
return
}
// 如果是插入数据的操作能拿到插入数据的ID
// ret.LastInsertId()
// 输出受影响的行数
fmt.Println(ret.RowsAffected())
}
// 通过 preparedStatement 执行操作
func prepareInsert() {
stmt, err := db.Prepare("insert into users(username, nickname, password, is_expert) values (?,?,?,?)")
if err != nil {
fmt.Println("stmt failed,", err)
return
}
defer stmt.Close()
_, err = stmt.Exec("zf", "张飞", "0000", 1)
_, err = stmt.Exec("lm", "李明", "8888", 0)
}
// 事务: 把多个操作结合在一起, 当成原子操作
func transactionTest() {
// 1 开始事务
tx, err := db.Begin()
if err != nil {
fmt.Println("begin failed, err:", err)
return
}
// 执行多个SQL操作
sql1 := `update users set password='124' where username='zf1'`
sql2 := `update users set nickname='张妃' where username='zf'`
_, err = tx.Exec(sql1)
if err != nil {
tx.Rollback()
return
}
_, err = tx.Exec(sql2)
if err != nil {
tx.Rollback()
return
}
err = tx.Commit()
fmt.Println(err)
}
func main() {
err := initDB()
if err != nil {
fmt.Println("连接数据库失败", err)
return
}
fmt.Println("连接数据库成功")
//queryRowTest()
//queryMultiRowsTest()
//insertRow()
//prepareInsert()
transactionTest()
}
使用sqlx
package main
import (
"fmt"
_ "github.com/go-sql-driver/mysql"
"github.com/jmoiron/sqlx"
)
// sqlx 需要用 go get -u github.com/jmoiron/sqlx 安装
var db *sqlx.DB
func initDB() (err error) {
dsn := "root:123456@tcp(127.0.0.1:3306)/remote_fix"
db, err = sqlx.Connect("mysql", dsn)
return err
}
type user struct {
Username string `db:"username"`
Nickname string `db:"nickname"`
IsExpert int `db:"is_expert"`
}
func main() {
err := initDB()
if err != nil {
fmt.Println("connect failed,", err)
return
}
// 获取单个用户
var u user
err = db.Get(&u, "select username, nickname, is_expert from users limit 1")
if err != nil {
fmt.Println("db.Get failed,", err)
}
fmt.Println(u)
// 获取多个用户
var userList = make([]user, 0, 10)
err = db.Select(&userList, "select username, nickname, is_expert from users")
fmt.Println(userList)
}
Redis
不写了