Go操作mysql Memcache Mongodb

u011321908 · · 4065 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。


date: 2014-12-12

发现go提供的操作msyql、memcache、mongodb的文档没有lua-ngx的好读,即实例不是很明确,此文列出自己操作时的实例,可让快速入手,但是优化以及错误处理等还有很多工作。

操作mysql

go-sql-driver/mysql Example 上提供了用go操作mysql的两个例子。例子中关于查询,一个是一次只取一个结果,一个是一次去多个结果,而且使用了prepare的方法,防止sql注入攻击。
此文中是参考上面例子,做的测试。

只取一个数据的例子

  1. import (
  2. "database/sql"
  3. _ "github.com/go-sql-driver/mysql"
  4. )
  5. func main() {
  6. db, err := sql.Open("mysql", "user:passwd@tcp(host:port)/db_name")
  7. if err != nil {
  8. panic(err.Error())
  9. }
  10. defer db.Close()
  11. stmtOut, err := db.Prepare("SELECT uid FROM mj_table limit 1")
  12. if err != nil {
  13. panic(err.Error())
  14. }
  15. var uid string
  16. err = stmtOut.QueryRow().Scan(&uid)
  17. if err != nil {
  18. Log.Info("err to Scan: %s", err)
  19. return
  20. }
  21. Log.Info("uid: %s", uid)
  22. }

取多个数据的例子

  1. ...
  2. rows, err := db.Query("select appid from mj_table limit 1")
  3. if err != nil {
  4. Log.Info("No Err in select msyql: %s", err)
  5. return
  6. }
  7. // Get column names
  8. columns, err := rows.Columns()
  9. if err != nil {
  10. panic(err.Error())
  11. }
  12. // Make a slice for the values
  13. values := make([]sql.RawBytes, len(columns))
  14. scanArgs := make([]interface{}, len(values)) // 必须要有此类型
  15. for i := range values {
  16. scanArgs[i] = &values[i]
  17. }
  18. // Fetch rows
  19. for rows.Next() {
  20. // get RawBytes from data
  21. err = rows.Scan(scanArgs...)
  22. if err != nil {
  23. panic(err.Error())
  24. }
  25. var value string
  26. for i, col := range values {
  27. if col == nil {
  28. value = "NULL"
  29. } else {
  30. value = string(col)
  31. }
  32. Log.Info("name: %s, value: %s ", columns[i], value)
  33. }
  34. Log.Info("-----------------------------------")
  35. }
  36. ...

操作mongodb

mgo是go语言操作MongoDb的驱动,因为接口比较丰富,官方文档看着也就比较长。

下面代码提供了建立连接、插入数据、查询、删除的操作

  1. import (
  2. "time"
  3. "gopkg.in/mgo.v2" // mgo的包
  4. "gopkg.in/mgo.v2/bson"
  5. )
  6. func main() {
  7. var (
  8. err error
  9. )
  10. //建立连接
  11. mongoURL := "192.168.1.140,192.168.1.141:20001,192.168.1.141:20002" //可在配置文件中设置
  12. maxWait := time.Duration(10 * time.Second)
  13. sess, err = mgo.DialWithTimeout(mongoURL, maxWait)
  14. if err != nil {
  15. Log.Error("mgo.Dial err:%s", err)
  16. panic(err)
  17. }
  18. sess.SetMode(mgo.Monotonic, true)
  19. defer sess.Close()
  20. //插入数据
  21. //...构造要插入数据
  22. db_name := "db"
  23. table_name := "table" // 即mongodb中的Collection
  24. dataBytes := []byte("{\"name\":\"jgj\"}")
  25. var intf map[string]interface{}
  26. err = json.Unmarshal(dataBytes, &intf)
  27. //...执行入库操作
  28. // new_sess := sess.Copy() // 可以复制一份回话,用新回话做操作
  29. col := sess.DB(appid).C(classname)
  30. err = col.Insert(intf)
  31. if err != nil {
  32. Log.Error("db POST, db insert error, appid:%s, class:%s, data:%s, err:%s", appid, classname, string(dataBytes), err)
  33. return
  34. }
  35. // 获取数据
  36. var objectid interface{}
  37. objectid = string("5486b4e08bb3c2659c000001")
  38. err = col.FindId(objectid).One(&intf)
  39. this.Data["json"] = intf
  40. // this.ServeJson() // 显示
  41. // 更新某个对象
  42. err = col.Update(bson.M{"_id": objectid, "updatedAt": oldUpdatedAt}, intf)
  43. // 删除某个对象
  44. err = col.RemoveId(objectid)
  45. // 查询
  46. selectParam := "{\"name\":true, \"age\":true}"
  47. var selectIntf map[string]bool
  48. err = json.Unmarshal([]byte(selectParam), &selectIntf)
  49. whereParam := "{\"or\":[{\"name\":\"jgj\"},{\"age\":\"29\"}]}"
  50. var whereIntf := map[string]interface{}{}
  51. err = json.Unmarshal([]byte(whereParam), &whereIntf)
  52. //...json to bson. 代码未提供
  53. ConvertBSON(whereIntf)
  54. sortParam = "name,-age"
  55. offset = 1
  56. limit = 10
  57. //...TODO 此处要有错误的判断
  58. query := col.Find(whereIntf)
  59. query = query.Sort(sortParam)
  60. query = query.Select(selectIntf)
  61. query = query.Skip(offset)
  62. query = query.Limit(limit)
  63. iter := query.Iter()
  64. var result []bson.M = make([]bson.M, 0)
  65. intf := bson.M{}
  66. for iter.Next(&intf) {
  67. result = append(result, intf)
  68. intf = bson.M{}
  69. }
  70. iter.Close()
  71. this.Data["json"] = result
  72. this.ServeJson()
  73. }

操作memcache

GoDoc中memcache的说明提供了操作的一些函数,没有给出实际的例子。下面是测试的小例子

  1. con := memcache.New("ip:host")
  2. if con == nil {
  3. Log.Info("Failed to connect Memcache")
  4. }
  5. item := &memcache.Item{Key:"jgj",Value:[]byte("test_value"),Expiration:0 }
  6. err := con.Set(item)
  7. if err != nil {
  8. Log.Info("failed to set item: %s", err)
  9. }
  10. item1, err := con.Get("jgj")
  11. if err != nil {
  12. Log.Info("Failed to get item %s ", err)
  13. return
  14. }
  15. Log.Info("get value: %s", item1.Value)

有疑问加站长微信联系(非本文作者)

本文来自:CSDN博客

感谢作者:u011321908

查看原文:Go操作mysql Memcache Mongodb

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

4065 次点击  ∙  1 赞  
加入收藏 微博
2 回复  |  直到 2000-01-01 00:00:00
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传