Golang database cache

database / sql Interface

Go official did not provide database-driven, but for the development of database-driven defines a number of standard interfaces database/sql, developers can develop the appropriate database-driven definition of the interface, this has the advantage, as long as the code is in accordance with standard interfaces developed later need when migrating a database, without any modification.

MySQL

There are several commonly used:

  • https://github.com/go-sql-driver/mysql support database / sql, in all go write.
  • https://github.com/ziutek/mymysql support database / sql, also supports the custom interface, all go to write.
  • https://github.com/Philio/GoMySQL does not support the database / sql, custom interfaces, all go to write.

As used herein go-sql-driver/mysqldriven presentations, because the largest number of people using the library, and supports database/sqlinterface.

Example:

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:%d\n", u.Id, u.Name, u.Gender, u.Age)
    }
}

Output:

id:1, name:allen, gender:1, age:20
id:2, name:alice, gender:2, age:18

Add:

stmt, err := db.Prepare("INSERT INTO user (name,age) VALUES (?, ?)")
checkErr(err)
res, err := stmt.Exec("golang", 10)
checkErr(err)
fmt.Println(res.LastInsertId())

Output:

26 <nil>

Note: The res.LastInsertId()return of new id and error.

Update:

stmt, err := db.Prepare("update user set age = ? where id = ?")
checkErr(err)
res, err := stmt.Exec(8, 26)
checkErr(err)
fmt.Println(res.RowsAffected())

Output:

1 <nil>

Note: The res.RowsAffected()return of influence function and error.

delete:

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())

You can simply look at the package:

func NewMysqlClient() (*sql.DB, error) {
    address := "127.0.0.1:3306"
    user := "root"
    password := ""
    database := "test"
    dsn := fmt.Sprintf("%s:%s@tcp(%s)/%s?charset=utf8mb4", user, password, address, database)
    db, err := sql.Open("mysql", dsn)
    return db, errors.Wrap(err, "can not connect db.")
}

PostgreSQL

Common Driver Library:

  • https://github.com/lib/pq support database / sql drive, pure Go write
  • https://github.com/jbarham/gopgsqldriver support database / sql drive, pure Go write
  • https://github.com/lxn/go-pgsql support database / sql drive, pure Go write

As used herein lib/pqdemonstrate, because the largest number of library use.

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:%s@%s/%s?sslmode=verify-full", user, password, address, database)
    db, err := sql.Open("postgres", dsn)
    return db, errors.Wrap(err, "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

Driver Library: https: //github.com/mattn/go-sqlite3

The driver uses database/sqlthe interface, the use and operation is the same as MySQL.

CRUD Example:

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)

}

You can simply look at the package:

func NewSqliteClient() (*sql.DB, error) {
    dbname := "./test_sqlite.db"
    db, err := sql.Open("sqlite3", dbname)
    return db, errors.Wrap(err, "can not connect db.")
}

repeat

Go redis driver currently supports the following

  • https://github.com/go-redis/redis (recommended)
  • https://github.com/gomodule/redigo (recommended)
  • https://github.com/hoisie/redis
  • https://github.com/alphazero/Go-Redis
  • https://github.com/simonz05/godis

The first two numbers are the most Star, the production environment is recommended two options from the front. Use the go-redis/redissimple.

go-redis/redisExamples

//获取客户端
func NewRedisClient() *redis.Client {
    client := redis.NewClient(&redis.Options{
        Addr:     "localhost:6379",
        Password: "", // no password set
        DB:       0,  // use default DB
    })

    //pong, err := client.Ping().Result()
    //fmt.Println(pong, err)
    // Output: PONG <nil>
    return client
}

//test
func ExampleClient() {
    client := NewRedisClient()
    defer client.Close()
    
    err := client.Set("key", "value", 0).Err()
    if err != nil {
        panic(err)
    }

    val, err := client.Get("key").Result()
    if err != nil {
        panic(err)
    }
    fmt.Println("key", val)

    val2, err := client.Get("key2").Result()
    if err == redis.Nil {
        fmt.Println("key2 does not exist")
    } else if err != nil {
        panic(err)
    } else {
        fmt.Println("key2", val2)
    }
    // Output: key value
    // key2 does not exist
}

mongoDB

Go for the best driver currently supports mongoDB is mgo, address: http: //labix.org/mgo.

Installation mgo:

go get gopkg.in/mgo.v2

Example:

package main

import (
    "fmt"
    "log"
    "gopkg.in/mgo.v2"
    "gopkg.in/mgo.v2/bson"
)

type Person struct {
    Name string
    Phone string
}

func main() {
    session, err := mgo.Dial("server1.example.com,server2.example.com")
    if err != nil {
            panic(err)
    }
    defer session.Close()

    // Optional. Switch the session to a monotonic behavior.
    session.SetMode(mgo.Monotonic, true)

    c := session.DB("test").C("people")
    err = c.Insert(&Person{"Ale", "+55 53 8116 9639"},
               &Person{"Cla", "+55 53 8402 8510"})
    if err != nil {
            log.Fatal(err)
    }

    result := Person{}
    err = c.Find(bson.M{"name": "Ale"}).One(&result)
    if err != nil {
            log.Fatal(err)
    }

    fmt.Println("Phone:", result.Phone)
}

Elasticsearch

Common drive:

  • https://github.com/olivere/elastic
    elasticsearch end customers Go language. (recommend)

  • https://github.com/mattbaird/elastigo
    mattbaird/elastigo: A Go (golang) based Elasticsearch client library.

Guess you like

Origin www.cnblogs.com/52fhy/p/11295095.html