`

go 数据库操作

    博客分类:
  • go
阅读更多

    一、  nosql 数据库操作

 

      1、redis

   版本1:

     github地址: 

     https://github.com/garyburd/redigo

 

    文档地址: 

   http://godoc.org/github.com/garyburd/redigo/redis

连接redis

package main
import (
    "fmt"
    "github.com/garyburd/redigo/redis"
)

func main() {
    c, err := redis.Dial("tcp", "127.0.0.1:6379")
    if err != nil {
        fmt.Println("Connect to redis error", err)
        return
    }
    defer c.Close()
}

 读写 默认(值永远不会过期)

 

_, err = c.Do("SET", "mykey", "superWang")
    if err != nil {
        fmt.Println("redis set failed:", err)
    }

    username, err := redis.String(c.Do("GET", "mykey"))
    if err != nil {
        fmt.Println("redis get failed:", err)
    } else {
        fmt.Printf("Get mykey: %v \n", username)
    }

 SET的附加参数设置过期:

 _, err = c.Do("SET", "mykey", "superWang", "EX", "5")

 批量写入读取

   MGET key [key …] 
  MSET key value [key value …]

批量写入读取对象(Hashtable) 
  HMSET key field value [field value …] 
  HMGET key field [field …]

检测值是否存在 
  EXISTS key

is_key_exit, err := redis.Bool(c.Do("EXISTS", "mykey1"))
    if err != nil {
        fmt.Println("error:", err)
    } else {
        fmt.Printf("exists or not: %v \n", is_key_exit)
    }

 删除  DEL key [key …]

 _, err = c.Do("DEL", "mykey")
    if err != nil {
        fmt.Println("redis delelte failed:", err)
    }

 读写json到redis

package main

import (
    "encoding/json"
    "fmt"

    "github.com/garyburd/redigo/redis"
)

func main() {
    c, err := redis.Dial("tcp", "127.0.0.1:6379")
    if err != nil {
        fmt.Println("Connect to redis error", err)
        return
    }
    defer c.Close()

    key := "profile"
    imap := map[string]string{"username": "666", "phonenumber": "888"}
    value, _ := json.Marshal(imap)

    n, err := c.Do("SETNX", key, value)
    if err != nil {
        fmt.Println(err)
    }
    if n == int64(1) {
        fmt.Println("success")
    }

    var imapGet map[string]string

    valueGet, err := redis.Bytes(c.Do("GET", key))
    if err != nil {
        fmt.Println(err)
    }

    errShal := json.Unmarshal(valueGet, &imapGet)
    if errShal != nil {
        fmt.Println(err)
    }
    fmt.Println(imapGet["username"])
    fmt.Println(imapGet["phonenumber"])
}

 设置过期时间 

   EXPIRE key seconds

// 设置过期时间为24小时  
n, _ := rs.Do("EXPIRE", key, 24*3600)  
if n == int64(1) {  
    fmt.Println("success")  
}  

 列表操作 

命令:

redis 127.0.0.1:6379> LPUSH runoobkey redis
(integer) 1
redis 127.0.0.1:6379> LPUSH runoobkey mongodb
(integer) 2
redis 127.0.0.1:6379> LPUSH runoobkey mysql
(integer) 3
redis 127.0.0.1:6379> LRANGE runoobkey 0 10

1) "mysql"
2) "mongodb"
3) "redis"

 

package main

import (
    "fmt"

    "github.com/garyburd/redigo/redis"
)

func main() {
    c, err := redis.Dial("tcp", "127.0.0.1:6379")
    if err != nil {
        fmt.Println("Connect to redis error", err)
        return
    }
    defer c.Close()

    _, err = c.Do("lpush", "runoobkey", "redis")
    if err != nil {
        fmt.Println("redis set failed:", err)
    }

    _, err = c.Do("lpush", "runoobkey", "mongodb")
    if err != nil {
        fmt.Println("redis set failed:", err)
    }
    _, err = c.Do("lpush", "runoobkey", "mysql")
    if err != nil {
        fmt.Println("redis set failed:", err)
    }

    values, _ := redis.Values(c.Do("lrange", "runoobkey", "0", "100"))

    for _, v := range values {
        fmt.Println(string(v.([]byte)))
    }
}

 管道

请求/响应服务可以实现持续处理新请求,即使客户端没有准备好读取旧响应。这样客户端可以发送多个命令到服务器而无需等待响应,最后在一次读取多个响应。这就是管道化(pipelining),这个技术在多年就被广泛使用了。距离,很多POP3协议实现已经支持此特性,显著加速了从服务器下载新邮件的过程。 
Redis很早就支持管道化,所以无论你使用任何版本,你都可以使用管道化技术

 

连接支持使用Send(),Flush(),Receive()方法支持管道化操作

Send(commandName string, args ...interface{}) error
Flush() error
Receive() (reply interface{}, err error)

 Send向连接的输出缓冲中写入命令。Flush将连接的输出缓冲清空并写入服务器端。Recevie按照FIFO顺序依次读取服务器的响应。下例展示了一个简单的管道:

c.Send("SET", "foo", "bar")
c.Send("GET", "foo")
c.Flush()
c.Receive() // reply from SET
v, err = c.Receive() // reply from GET

 Do方法组合了Send,Flush和 Receive方法。Do方法先写入命令,然后清空输出buffer,最后接收全部挂起响应包括Do方发出的命令的结果。如果任何响应中包含一个错误,Do返回错误。如果没有错误,Do方法返回最后一个响应。

  版本2:

开源库go-redis/redis的使用

 

github地址: 

https://github.com/go-redis/redis

 

文档地址: 

 

https://godoc.org/github.com/go-redis/redis

 

package main

import (
    "fmt"

    "github.com/go-redis/redis"
)

func main() {
    client := redis.NewClient(&redis.Options{
        Addr:     "127.0.0.1:6379",
        Password: "", // no password set
        DB:       0,  // use default DB
    })

    pong, err := client.Ping().Result()
    fmt.Println(pong, err)

    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 exists")
    } else if err != nil {
        panic(err)
    } else {
        fmt.Println("key2", val2)
    }
}

   版本3:

github地址: 

https://github.com/astaxie/goredis

package main
import (
    "github.com/astaxie/goredis"
    "fmt"
)
func main() {
    var client goredis.Client
    // 
设置端口为
redis
默认端口
    client.Addr = "127.0.0.1:6379"
    //
字符串操作
    client.Set("a", []byte("hello"))
    val, _ := client.Get("a")
    fmt.Println(string(val))
    client.Del("a")
    //list
操作
    vals := []string{"a", "b", "c", "d", "e"}
    for _, v := range vals {
        client.Rpush("l", []byte(v))
    }
    dbvals,_ := client.Lrange("l", 0, 4)
    for i, v := range dbvals {
        println(i,":",string(v))
    }
    client.Del("l")
}

  二、  mongodb 数据库操作

  先安装Golang和MongoDB

  安装bzr版本工具(mgo使用Bazaar作为版本控制系统,因安装的时候需要去Bazaar拉取代码)

   执行:

  go get labix.org/v2/mgo

 

如果是本机,并且MongoDB是默认端口27017启动的话,下面几种方式都可以。

session, err := mgo.Dial("")
session, err := mgo.Dial("localhost")
session, err := mgo.Dial("127.0.0.1")
session, err := mgo.Dial("localhost:27017")
session, err := mgo.Dial("127.0.0.1:27017")

 如果不在本机或端口不同,传入相应的地址即可。如:

      mongodb://myuser:mypass@localhost:40001,otherhost:40001/mydb

通过Session.DB()来切换相应的数据库。

  实现:

import (
    "fmt"
    "labix.org/v2/mgo"
    "labix.org/v2/mgo/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()
    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 {
        panic(err)
    }
    result := Person{}
    err = c.Find(bson.M{"name": "Ale"}).One(&result)
    if err != nil {
        panic(err)
    }
    fmt.Println("Phone:", result.Phone)
}

 切换数据库

 

分享到:
评论

相关推荐

    高效便捷的Go语言数据库操作库 - gosql基于sqlx封装

    项目名称:gosql - 高效便捷的Go语言数据库操作库 项目语言:Go 文件构成:共计40个文件,包括: - Go 源码文件:30个 - Markdown 文档:3个 - YAML 配置文件:1个 - Git 忽略配置:1个 - 许可证文件:1个 - ...

    Go语言数据库操作:databasesql包的高效应用

    ### Go语言数据库操作:database/sql包的高效应用 #### 一、引言 Go语言,又称Golang,是由Google开发并开源的一种静态类型、编译型的语言。它以简洁、高效及良好的并发支持著称,非常适合构建大规模软件系统和...

    Go-gorose(goorm)一个小巧强悍的go语言数据库操作orm

    一个小巧强悍的go语言数据库操作orm, 灵感来源于laravel的数据库操作orm, 也就是eloquent, php、python、ruby开发者, 都会喜欢上这个orm的操作方式, 主要是链式操作比较风骚)

    Go-Prana是一个Golang数据库管理和代码生成

    Go-Prana是一款基于Golang语言的数据库管理与代码生成工具,它的主要功能集中在简化数据库操作和提升开发效率上。Prana提供了丰富的命令行接口,让开发者能够方便地执行SQL迁移、运行嵌入式SQL脚本以及根据数据库...

    Golang数据库操作

    针对Golang的数据库操作,以及JSON输出,包括连接池、

    Go-gosql-基于sqlx封装的Golang数据库操作

    这个库在sqlx的基础上进行了一些简单的封装,同时支持struct和map两种形式可以方便的进行快速开发,并且提供辅助结构体生成工具 genstruct 可以用于一键将数据库表转换成golang struct代码

    Go语言数据库交互技术详解:关系型与NoSQL数据库操作

    ② 掌握常见的数据库操作技术和性能优化方法;③ 了解如何在微服务架构中实现数据库的独立性和解耦。 阅读建议:建议读者跟随文中提供的示例代码进行实际操作,并在遇到具体应用场景时结合这些技术来解决问题。同时...

    go语言数据库驱动github

    标题"Go语言数据库驱动github"指的是在Go语言中,开发者可以从GitHub获取各种数据库驱动程序的源代码。GitHub是一个全球知名的开源代码托管平台,其中包含了无数的开源项目,包括Go语言的各种数据库驱动。这些驱动...

    Go-gendry是一个go语言的数据库操作工具集

    Go-gendry是一个专为Go语言开发者设计的数据库操作工具包,它提供了丰富的功能来简化数据库的连接管理和SQL操作,从而提升开发效率和代码的可维护性。在深入探讨Go-gendry之前,我们先来了解一下Go语言在数据库操作...

    Go语言的数据库操作与ORM框架使用.md

    如何在 Go 语言中进行数据库操作与使用 ORM 框架,包括从使用 Go 原生 `database/sql` 包进行数据库连接、查询、增删改、事务处理,到选择和使用常见的 ORM 框架如 GORM、SQLBoiler 和 Ent。首先,文章详细讲解了 `...

    golang常用库之操作数据库的orm框架-gorm基本使用详解

    golang常用库:操作数据库的orm框架-gorm基本使用 一:字段映射-模型定义 gorm中通常用struct来映射字段. gorm教程中叫模型定义 比如我们定义一个模型Model: type User struct { gorm.Model UserId int64 `gorm:...

    基于go-sql-driver/mysql的数据库操作辅助Go包设计源码

    该项目是利用go-sql-driver/mysql驱动的Go语言数据库操作辅助包Gendry的设计源码,包含23个文件,其中包括12个Go源代码文件、6个Markdown文档、1个YAML配置文件、1个Git忽略文件、1个LICENSE文件、1个go.mod文件和1...

    golang 数据库 表 结构体自动生成工具.zip

    总的来说,"Go语言数据库表结构体自动生成工具"是Golang开发中的利器,它能够帮助开发者快速地构建与数据库模型对应的结构体,使得数据库操作更加便捷和高效。这个压缩包文件`ljg_resource1`可能包含了具体的工具...

    go语言连接数据库作业.docx

    在Go语言中,连接数据库并进行相关操作是常见的任务,特别是在开发像学生管理系统这样的应用程序时。Go语言提供了标准库`database/sql`以及第三方驱动来支持与各种数据库的交互,如MySQL、PostgreSQL、SQLite等。...

    基于GO语言实现的仿gorm的一个操作SQL数据库的框架源代码

    在这个场景中,我们讨论的是一个基于Go语言仿照GORM实现的数据库操作框架的源代码。 首先,GORM的设计目标是提供一种更加简单和直观的方式来操作数据库,使得开发者无需编写大量的SQL语句,就能完成数据的增删查改...

    go语言在beego框架中使用orm,进行数据库操作。

    ORM(Object-Relational Mapping)是Beego框架中的一个重要组成部分,用于简化数据库操作,将数据库表映射为Go语言的结构体,从而实现面向对象的数据库访问。 在Go语言中使用Beego的ORM,首先需要进行基础的配置,...

    Golang与数据库的共舞:深入数据库操作

    Golang,通常被称为Go语言,是一种由谷歌开发的编程语言。它以简洁、高效、安全著称,并且非常适合构建大规模的分布式系统和微服务。Go语言的一些主要特点包括: 1. **简洁性**:Go语言的语法非常简单,易于学习。 ...

    Go语言操作mysql数据库简单例子

    Go语言操作数据库非常的简单, 他也有一个类似JDBC的东西”database/sql” 实现类是”github.com/go-sql-driver/mysql” 使用过JDBC的人应该一看就懂 对日期的处理比较晦涩,没有JAVA流畅: 代码如下: package main ...

    GO语言 数据库版学生信息管理系统.zip

    Go语言,又称为Golang,是Google在2009年推出的一种静态类型的、编译型的、并发型的、垃圾回收的、C风格的编程语言。其设计目标是提高开发者的生产力和程序的运行效率。Go语言的并发模型基于CSP(Communicating ...

    Go-Go数据库迁移工具

    `goose`作为一个强大的Go语言数据库迁移工具,简化了数据库版本控制,提升了开发效率。它的跨平台特性、对多种数据库的支持以及Go脚本迁移功能,使得`goose`成为Go项目中的理想选择。通过合理使用`goose`,开发者...

Global site tag (gtag.js) - Google Analytics