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 协议》,转载必须注明作者和本文链接