• golang xorm应用


    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
    ", 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
  • 相关阅读:
    leetcode-----118. 杨辉三角
    leetcode-----117. 填充每个节点的下一个右侧节点指针 II
    leetcode-----116. 填充每个节点的下一个右侧节点指针
    leetcode-----115. 不同的子序列
    leetcode-----114. 二叉树展开为链表
    leetcode-----113. 路径总和 II
    leetcode-----112. 路径总和
    leetcode-----111. 二叉树的最小深度
    windows同时安装jdk7和jdk8
    使用乌龟Git连接github
  • 原文地址:https://www.cnblogs.com/DaBing0806/p/6680748.html
Copyright © 2020-2023  润新知