Golang数据库、缓存
database/sql 接口Go官方没有提供数据库驱动,而是为开发数据库驱动定义了一些标准接口 MySQL常用的有如下几种:
这里使用 示例: package main import ( _ "github.com/go-sql-driver/mysql" "database/sql" "fmt" ) type User struct { Id int Name string Gender int Age int } func checkErr(err error) { if err != nil { panic(err) } } func main() { db,err := sql.Open("mysql","root:@(127.0.0.1:3306)/test?charset=utf8") checkErr(err) //查询 rows,err := db.Query("SELECT id,name,gender,age from user limit 2") checkErr(err) var users []User for rows.Next() { var u User rows.Scan(&u.Id,&u.Name,&u.Gender,&u.Age) users = append(users,u) } //fmt.Print(users) for _,u := range users{ fmt.Printf("id:%d,name:%s,gender:%d,age:%dn",u.Id,u.Name,u.Gender,u.Age) } } 输出: id:1,name:allen,gender:1,age:20 id:2,name:alice,gender:2,age:18 新增: stmt,err := db.Prepare("INSERT INTO user (name,age) VALUES (?,?)") checkErr(err) res,err := stmt.Exec("golang",10) checkErr(err) fmt.Println(res.LastInsertId()) 输出: 26 <nil> 注: 更新: stmt,err := db.Prepare("update user set age = ? where id = ?") checkErr(err) res,err := stmt.Exec(8,26) checkErr(err) fmt.Println(res.RowsAffected()) 输出: 1 <nil> 注: 删除: stmt,err := db.Prepare("DELETE FROM user where id = ?") checkErr(err) res,err := stmt.Exec( 26) checkErr(err) fmt.Println(res.RowsAffected()) //或者 //res,err := db.Exec("DELETE FROM user where id = 26") //checkErr(err) //fmt.Println(res.RowsAffected()) 可以简单封装一下: func NewMysqlClient() (*sql.DB,error) { address := "127.0.0.1:3306" user := "root" password := "" database := "test" dsn := fmt.Sprintf("%s:%[email?protected](%s)/%s?charset=utf8mb4",user,password,address,database) db,dsn) return db,errors.Wrap(err,"can not connect db.") } PostgreSQL常见驱动库:
这里使用 import ( "database/sql" _ "github.com/lib/pq" ) //获取客户端 func NewPostgreSQLClient() (*sql.DB,error) { address := "127.0.0.1" user := "pqgotest" password := "" database := "pqgotest" dsn := fmt.Sprintf("%s://%s:%[email?protected]%s/%s?sslmode=verify-full",err := sql.Open("postgres","can not connect db.") } func main() { db,err := NewPostgreSQLClient() if err != nil { log.Fatal(err) } age := 21 rows,err := db.Query("SELECT name FROM users WHERE age = $1",age) //… } SQLite驱动库:https://github.com/mattn/go-sqlite3 该驱动采用 增删改查示例: package main import ( "database/sql" "fmt" _ "github.com/mattn/go-sqlite3" ) //CREATE TABLE `userinfo` ( // `uid` INTEGER PRIMARY KEY AUTOINCREMENT,// `username` VARCHAR(64) NULL,// `departname` VARCHAR(64) NULL,// `created` DATE NULL //); func checkErr(err error) { if err != nil { panic(err) } } type UserInfo struct { uid int username string departname string created string } func main() { db,err := sql.Open("sqlite3","./test_sqlite.db") checkErr(err) //增加 stmt,err := db.Prepare("insert into userinfo(username,departname,created) values(?,?,?)") checkErr(err) res,err := stmt.Exec("yjc","test","2018-08-12") checkErr(err) id,err := res.LastInsertId() checkErr(err) fmt.Println(id) //更新 stmt,err = db.Prepare("update userinfo set username = ? where uid = ?") checkErr(err) res,err = stmt.Exec("golang",1) checkErr(err) affect,err := res.RowsAffected() checkErr(err) fmt.Println(affect) //查询 rows,err := db.Query("select * from userinfo") checkErr(err) var user UserInfo var users []UserInfo for rows.Next() { rows.Scan(&user.uid,&user.username,&user.departname,&user.created) users = append(users,user) } fmt.Println(users) //删除 stmt,err = db.Prepare("delete from userinfo where uid = ?") checkErr(err) res,err = stmt.Exec(2) checkErr(err) affect,err = res.RowsAffected() checkErr(err) fmt.Println(affect) } 可以简单封装一下: func NewSqliteClient() (*sql.DB,error) { dbname := "./test_sqlite.db" db,dbname) return db,"can not connect db.") } redisGo目前支持redis的驱动有如下
前面两个Star数是最多的,生产环境推荐从前面两个选择。使用上
|