网站在线客服系统GOFLY代码开发日志-10: gorm执行原生SQL语句

gorm框架操作数据库,一般是使用orm框架所提供的方法函数,是对数据库curd操作sql进行了封装

但是有的时候,封装的方法并不能完全满足我们的需求,我们需要能执行原生sql语句。

原生执行增删改操作

GOFLY在线客服系统里面,可以直接通过程序导入建表语句以及初始数据,这个时候就需要gorm原生执行增加,删除,修改操作,不需要获取每条数据结果

比如我的models包下

var DB *gorm.DB

func NewConnect(mysqlConfigFile string) error {
    var mysql = &types.Mysql{
        Username: "go_fly_pro",
        Password: "go_fly_pro",
        Database: "go_fly_pro",
        Server:   "127.0.0.1",
        Port:     "3306",
    }
    isExist, _ := tools.IsFileExist(mysqlConfigFile)
    if !isExist {
        panic("MYSQL配置文件不存在!" + mysqlConfigFile)
    }
    info, err := ioutil.ReadFile(mysqlConfigFile)
    if err != nil {
        panic("MYSQL配置文件读取失败!" + err.Error())
    }
    err = json.Unmarshal(info, mysql)
    if err != nil {
        panic("解析MYSQL配置文件JSON结构失败!" + err.Error())
    }
    dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8mb4&parseTime=True&loc=Local", mysql.Username, mysql.Password, mysql.Server, mysql.Port, mysql.Database)
    DB, err = gorm.Open("mysql", dsn)
    if err != nil {
        log.Println(err)
        panic("数据库连接失败!")
        return err
    }
    DB.SingularTable(true)
    DB.LogMode(true)
    DB.DB().SetMaxIdleConns(10)
    DB.DB().SetMaxOpenConns(100)
    DB.DB().SetConnMaxLifetime(59 * time.Second)
    return nil
}

func Execute(sql string) error {
    db := DB.Exec(sql)
    err := db.Error
    if err != nil {
        log.Println("models.go sql execute error:" + err.Error())
        return err
    }
    return nil
}

这个方法就是执行原生sql增删改

func Execute(sql string) error {
    db := DB.Exec(sql)
    err := db.Error
    if err != nil {
        log.Println("models.go sql execute error:" + err.Error())
        return err
    }
    return nil
}

原生执行查询操作

例如我下面这条sql语句,按天查询条数,DB是上面的全局变量,通过.Raw().Scan来执行原生的查询语句

//查询每天条数
type EveryDayNum struct {
    Day string `json:"day"`
    Num int64  `json:"num"`
}

func CountVisitorsEveryDay(toId string) []EveryDayNum {
    var results []EveryDayNum
    DB.Raw("select DATE_FORMAT(created_at,'%Y-%m-%d') as day ,"+
        "count(*) as num from visitor where to_id=? group by day order by day desc limit 30",
        toId).Scan(&results)
    return results
}

后面还遇到了哪些问题和知识点将会继续进行总结。

演示网站:
gofly.sopans.com

本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 1

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!