데이터베이스 / SQL 인터페이스
이동 관계자는 데이터베이스 기반 제공하지만, 데이터베이스 기반의 개발을위한 표준 인터페이스의 수를 정의하지 않은 database/sql
개발자는 인터페이스의 적절한 데이터베이스 기반 정의를 개발할 수 있습니다, 이것은 장점, 한 코드는 표준 인터페이스에 따라 개발로 나중에 필요가 있습니다 어떤 수정없이 데이터베이스를 마이그레이션 할 때.
MySQL의
몇 가지 일반적으로 사용되는이 있습니다 :
- 모두 https://github.com/go-sql-driver/mysql 지원 데이터베이스 / SQL은, 쓰기를 이동합니다.
- https://github.com/ziutek/mymysql 지원 데이터베이스 / SQL은, 모든 쓰기로 이동, 사용자 정의 인터페이스를 지원합니다.
- https://github.com/Philio/GoMySQL는, 사용자 정의 인터페이스를 데이터베이스 / SQL을 지원하지 않는 모든 쓰기로 이동합니다.
본 명세서에서 사용 된 바와 같이 go-sql-driver/mysql
사람들의 가장 큰 수는 라이브러리를 사용하기 때문에, 구동 프리젠 테이션을하고, 지원하는 database/sql
인터페이스를.
예 :
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)
}
}
출력 :
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>
참고 : res.LastInsertId()
새로운 ID와 오류의 반환을.
업데이트 :
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>
참고 : res.RowsAffected()
영향 함수와 오류의 반환을.
삭제 :
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:%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의
일반적인 드라이버 라이브러리 :
- https://github.com/lib/pq 지원 데이터베이스 / SQL 드라이브, 순수 이동 쓰기
- https://github.com/jbarham/gopgsqldriver 지원 데이터베이스 / SQL 드라이브, 순수 이동 쓰기
- https://github.com/lxn/go-pgsql 지원 데이터베이스 / SQL 드라이브, 순수 이동 쓰기
여기에서 사용으로 lib/pq
인해 가장 많은 도서관 이용의, 보여줍니다.
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는
드라이버 라이브러리 : HTTPS : //github.com/mattn/go-sqlite3
드라이버가 사용 database/sql
인터페이스의 사용 및 동작은 MySQL의 것과 동일하다.
CRUD 예 :
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, err := sql.Open("sqlite3", dbname)
return db, errors.Wrap(err, "can not connect db.")
}
반복
레디 스 드라이버가 현재 다음을 지원 이동
- https://github.com/go-redis/redis (권장)
- https://github.com/gomodule/redigo (권장)
- https://github.com/hoisie/redis
- https://github.com/alphazero/Go-Redis
- https://github.com/simonz05/godis
처음 두 숫자는 대부분의 스타, 생산 환경이 정면에서 두 가지 옵션을 권장합니다. 사용 go-redis/redis
간단합니다.
go-redis/redis
예
//获取客户端
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를
HTTP : //labix.org/mgo 최고의 드라이버로 이동하는 것은 현재 MongoDB를이 산화 마그네슘입니다 주소를 지원합니다.
설치 산화 마그네슘 :
go get gopkg.in/mgo.v2
예 :
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
일반적인 드라이브 :
https://github.com/olivere/elastic
elasticsearch 최종 고객은 언어를 이동합니다. (권장)https://github.com/mattbaird/elastigo
mattbaird / elastigo : 갈 (golang) 기반 Elasticsearch 클라이언트 라이브러리.