设为首页 收藏本站
查看: 1313|回复: 0

[经验分享] golang xorm应用

[复制链接]

尚未签到

发表于 2018-9-19 13:16:03 | 显示全部楼层 |阅读模式
  github.com/go-xorm/xorm  xorm库
  http://www.xorm.io/docs/  手册
  xorm是一个简单而强大的Go语言ORM库. 通过它可以使数据库操作非常简便。xorm的目标并不是让你完全不去学习SQL,我们认为SQL并不会为ORM所替代,但是ORM将可以解决绝大部分的简单SQL需求。
  在xorm里面,可以同时存在多个Orm引擎,一个Orm引擎称为Engine,一个Engine一般只对应一个数据库。Engine通过调用xorm.NewEngine生成,如:
  

var engine *xorm.Engine  

  在使用前,记得导入需要的包
  

import (  _ "github.com/go-sql-driver/mysql"
  "github.com/go-xorm/xorm"
  
)
  

  创建完成engine之后,并没有立即连接数据库,此时可以通过engine.Ping()来进行数据库的连接测试是否可以连接到数据库。另外对于某些数据库有连接超时设置的,可以通过起一个定期Ping的Go程来保持连接鲜活。
  engine可以通过engine.Close来手动关闭,但是一般情况下可以不用关闭,在程序退出时会自动关闭。
  如果是go-sql-driver,执行exec()也会自动关闭,但是执行Query()则需要关闭。

日志
  xorm的日志比使用go-sql-driver要好用,总体来说xorm是现有的orm中值得一用的一个。
  日志是一个接口,通过设置日志,可以显示SQL,警告以及错误等,默认的显示级别为INFO。


  • engine.ShowSQL(true),则会在控制台打印出生成的SQL语句;
  • engine.Logger().SetLevel(core.LOG_DEBUG),则会在控制台打印调试及以上的信息;
  如果希望将信息不仅打印到控制台,而是保存为文件,那么可以通过类似如下的代码实现,NewSimpleLogger(w io.Writer)接收一个io.Writer接口来将数据写入到对应的设施中。
  当然,如果希望将日志记录到syslog中,也可以如下:
  

logWriter, err := syslog.New(syslog.LOG_DEBUG, "rest-xorm-example")  
if err != nil {
  log.Fatalf("Fail to create xorm system logger: %v\n", err)
  
}
  

  
logger := xorm.NewSimpleLogger(logWriter)
  
logger.ShowSQL(true)
  
engine.SetLogger(logger)
  

  

连接池
  engine内部支持连接池接口和对应的函数。
  ps:go-sql-driver 内部也支持连接池。


  • 如果需要设置连接池的空闲数大小,可以使用engine.SetMaxIdleConns()来实现。
  • 如果需要设置最大打开连接数,则可以使用engine.SetMaxOpenConns()来实现。
  最后,举一个xorm的使用例子
  

var users []User  
err :
= engine.Where("name = ?", name).And("age > 10").Limit(10, 0).Find(&users)  

// SELECT * FROM user WHERE name = ? AND age > 10 limit 0 offset 10  

  
type Detail struct {
  Id int64
  UserId int64 `xorm:
"index"`  
}
  

  
type UserDetail struct {
  User `xorm:
"extends"`  Detail `xorm:
"extends"`  
}
  

  
var users []UserDetail
  
err :
= engine.Table("user").Select("user.*, detail.*")  Join(
"INNER", "detail", "detail.user_id = user.id").  Where(
"user.name = ?", name).Limit(10, 0).  Find(
&users)  

// SELECT user.*, detail.* FROM user INNER JOIN detail WHERE user.name = ? limit 0 offset 10  




运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-594298-1-1.html 上篇帖子: golang学习之go简单博客应用 下篇帖子: golang操作mysql使用总结
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表