go 连接数据库 - GORM学习 - sql查询

go 连接数据库 - GORM学习 - sql查询

go语言的数据库连接使用的三方库, 官网有中文文档,地址是 GORM指南

安装

go get -u gorm.io/gorm
go get -u gorm.io/driver/sqlite

准备数据库

假设本地 3306 端口有数据库 mywawo,账号 root,密码 root
表:

CREATE TABLE `wws_user2` (
  `id` bigint unsigned NOT NULL AUTO_INCREMENT,
  `user_name` char(30) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '用户真实姓名',
  `created_at` timestamp NULL DEFAULT NULL COMMENT '添加时间',
  `updated_at` timestamp NULL DEFAULT NULL COMMENT '修改时间',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB   COMMENT='用户表'

建好后自行插入一些数据。

代码 orm/orm.go

orm是自己项目的目录。

package main

import (
    "fmt"
    "log"
    "os"
    "time"

    "gorm.io/driver/mysql"
    "gorm.io/gorm"
    "gorm.io/gorm/logger"

    . "orm/models"
)

var db *gorm.DB

func init() {
    var err error
    dsn := "root:root@tcp(127.0.0.1:3306)/mywawo?charset=utf8mb4&parseTime=True&loc=Local"

    //  默认的级别,会打印find找不到模型时的sql语句。
    // Silent 就不会。
    newLogger := logger.New(
        log.New(os.Stdout, "\r\n", log.LstdFlags), // io writer
        logger.Config{
            SlowThreshold: time.Second,   // Slow SQL threshold
            LogLevel:      logger.Silent, // 可选 Silent,Error,Warn,Info
            Colorful:      true,          // Disable color
        },
    )

    db, err = gorm.Open(mysql.Open(dsn), &gorm.Config{
        Logger:                                   newLogger,
        DisableForeignKeyConstraintWhenMigrating: true})
    if err != nil {
        panic(err)
    }

}

func main() {

    fmt.Println("开始orm")
    var user User
    var users []User
    var result *gorm.DB
    fmt.Println("-- 查询单个结果,想查询主键为1的记录 --")
    result = db.First(&user, 1)
    display_first(result, user)

    fmt.Println("\n-- 查询单个结果,想查询主键为2的记录 --")
    result = db.First(&user, 2)
    display_first(result, user)

    fmt.Println("\n-- 查询多个结果,应该无法查到结果 --")
    result = db.Where("id <  ?", 0).Order("id desc").Order("user_name").Offset(0).Limit(3).Find(&users)
    display_find(result, users)

    fmt.Println("\n-- 查询多个结果,根据字段 --")
    result = db.Where("id >  ?", 1).Where("user_name", "老朱").Order("id desc").Order("user_name").Offset(0).Limit(3).Find(&users)
    display_find(result, users)

    fmt.Println("\n-- 查询多个结果,根据字段,分开拼接sql --")
    where := db
    where = where.Where("id >  ?", 1)
    where = where.Order("id desc")
    where = where.Order("user_name")
    where = where.Offset(1)
    where = where.Limit(4)
    result = where.Find(&users)
    display_find(result, users)

}

func display_first(tx *gorm.DB, obj interface{}) {
    if err := tx.Error; err != nil {
        fmt.Println("单个结果查询,没找到结果")
    } else {
        fmt.Println(obj)
    }
}

func display_find(tx *gorm.DB, arr interface{}) {
    switch arr.(type) {
    case []User:
        //fallthrough
        arr2 := arr.([]User)
        if tx.RowsAffected == 0 {
            fmt.Println("多个结果查询,没找到结果")
        } else {
            fmt.Println("多个结果查询,查到结果了。")
            fmt.Println(arr2)
        }
    }

}

代码 orm/models/user.go

package models

import (
    "database/sql"
    "time"
)

type User struct {
    ID        uint
    UserName  sql.NullString
    CreatedAt time.Time
    UpdatedAt time.Time
}

// TableName 会将 User 的表名重写为 `profiles`
func (User) TableName() string {
    return "wws_user2"
}

最后执行结果

开始orm
-- 查询单个结果,想查询主键为1的记录 --
{1 {张三 true} 2019-03-19 16:20:18 +0800 CST 2019-11-05 11:28:18 +0800 CST}

-- 查询单个结果,想查询主键为2的记录 --
单个结果查询,没找到结果

-- 查询多个结果,应该无法查到结果 --
多个结果查询,没找到结果

-- 查询多个结果,根据字段 --
多个结果查询,查到结果了。
[{37 {老朱 true} 2019-08-26 16:04:10 +0800 CST 2019-09-04 20:39:42 +0800 CST}]

-- 查询多个结果,根据字段,分开拼接sql --
多个结果查询,查到结果了。
[{54 {谢谢你 true} 2020-04-21 20:15:25 +0800 CST 2020-04-21 20:15:25 +0800 CST} {53 {cvc true} 2020-02-22 15:33:33 +0800 CST 2020-02-22 15:33:52 +0800 CST} {52 {jxf true} 2020-02-22 15:14:58 +0800 CST 2020-02-22 15:33:49 +0800 CST} {51 {是多少 true} 2020-02-22 15:14:07 +0800 CST 2020-02-22 15:33:44 +0800 CST}
本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!
未填写
文章
50
粉丝
7
喜欢
60
收藏
94
排名:591
访问:1.3 万
私信
所有博文
社区赞助商