一、 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) }
切换数据库
相关推荐
项目名称:gosql - 高效便捷的Go语言数据库操作库 项目语言:Go 文件构成:共计40个文件,包括: - Go 源码文件:30个 - Markdown 文档:3个 - YAML 配置文件:1个 - Git 忽略配置:1个 - 许可证文件:1个 - ...
### Go语言数据库操作:database/sql包的高效应用 #### 一、引言 Go语言,又称Golang,是由Google开发并开源的一种静态类型、编译型的语言。它以简洁、高效及良好的并发支持著称,非常适合构建大规模软件系统和...
一个小巧强悍的go语言数据库操作orm, 灵感来源于laravel的数据库操作orm, 也就是eloquent, php、python、ruby开发者, 都会喜欢上这个orm的操作方式, 主要是链式操作比较风骚)
Go-Prana是一款基于Golang语言的数据库管理与代码生成工具,它的主要功能集中在简化数据库操作和提升开发效率上。Prana提供了丰富的命令行接口,让开发者能够方便地执行SQL迁移、运行嵌入式SQL脚本以及根据数据库...
针对Golang的数据库操作,以及JSON输出,包括连接池、
这个库在sqlx的基础上进行了一些简单的封装,同时支持struct和map两种形式可以方便的进行快速开发,并且提供辅助结构体生成工具 genstruct 可以用于一键将数据库表转换成golang struct代码
② 掌握常见的数据库操作技术和性能优化方法;③ 了解如何在微服务架构中实现数据库的独立性和解耦。 阅读建议:建议读者跟随文中提供的示例代码进行实际操作,并在遇到具体应用场景时结合这些技术来解决问题。同时...
标题"Go语言数据库驱动github"指的是在Go语言中,开发者可以从GitHub获取各种数据库驱动程序的源代码。GitHub是一个全球知名的开源代码托管平台,其中包含了无数的开源项目,包括Go语言的各种数据库驱动。这些驱动...
Go-gendry是一个专为Go语言开发者设计的数据库操作工具包,它提供了丰富的功能来简化数据库的连接管理和SQL操作,从而提升开发效率和代码的可维护性。在深入探讨Go-gendry之前,我们先来了解一下Go语言在数据库操作...
如何在 Go 语言中进行数据库操作与使用 ORM 框架,包括从使用 Go 原生 `database/sql` 包进行数据库连接、查询、增删改、事务处理,到选择和使用常见的 ORM 框架如 GORM、SQLBoiler 和 Ent。首先,文章详细讲解了 `...
golang常用库:操作数据库的orm框架-gorm基本使用 一:字段映射-模型定义 gorm中通常用struct来映射字段. gorm教程中叫模型定义 比如我们定义一个模型Model: type User struct { gorm.Model UserId int64 `gorm:...
该项目是利用go-sql-driver/mysql驱动的Go语言数据库操作辅助包Gendry的设计源码,包含23个文件,其中包括12个Go源代码文件、6个Markdown文档、1个YAML配置文件、1个Git忽略文件、1个LICENSE文件、1个go.mod文件和1...
总的来说,"Go语言数据库表结构体自动生成工具"是Golang开发中的利器,它能够帮助开发者快速地构建与数据库模型对应的结构体,使得数据库操作更加便捷和高效。这个压缩包文件`ljg_resource1`可能包含了具体的工具...
在Go语言中,连接数据库并进行相关操作是常见的任务,特别是在开发像学生管理系统这样的应用程序时。Go语言提供了标准库`database/sql`以及第三方驱动来支持与各种数据库的交互,如MySQL、PostgreSQL、SQLite等。...
在这个场景中,我们讨论的是一个基于Go语言仿照GORM实现的数据库操作框架的源代码。 首先,GORM的设计目标是提供一种更加简单和直观的方式来操作数据库,使得开发者无需编写大量的SQL语句,就能完成数据的增删查改...
ORM(Object-Relational Mapping)是Beego框架中的一个重要组成部分,用于简化数据库操作,将数据库表映射为Go语言的结构体,从而实现面向对象的数据库访问。 在Go语言中使用Beego的ORM,首先需要进行基础的配置,...
Golang,通常被称为Go语言,是一种由谷歌开发的编程语言。它以简洁、高效、安全著称,并且非常适合构建大规模的分布式系统和微服务。Go语言的一些主要特点包括: 1. **简洁性**:Go语言的语法非常简单,易于学习。 ...
Go语言操作数据库非常的简单, 他也有一个类似JDBC的东西”database/sql” 实现类是”github.com/go-sql-driver/mysql” 使用过JDBC的人应该一看就懂 对日期的处理比较晦涩,没有JAVA流畅: 代码如下: package main ...
Go语言,又称为Golang,是Google在2009年推出的一种静态类型的、编译型的、并发型的、垃圾回收的、C风格的编程语言。其设计目标是提高开发者的生产力和程序的运行效率。Go语言的并发模型基于CSP(Communicating ...
`goose`作为一个强大的Go语言数据库迁移工具,简化了数据库版本控制,提升了开发效率。它的跨平台特性、对多种数据库的支持以及Go脚本迁移功能,使得`goose`成为Go项目中的理想选择。通过合理使用`goose`,开发者...