1、gorm连接mysql
gorm.Open(dialector Dialector, opts ...Option) // gorm.Open(Dialector的Config,gorm的Config)
第一个参数是数据库链接信息Dialector,可以New新建,也可以直接Open打开现有Dialector。
第二个参数是各种设置,对NamingStrategy的设置就是其中的一个,禁用表名变复数的方法下面会说。
//1 导包,不要错了
import (
"errors"
"fmt"
"gorm.io/driver/mysql" //包名不要错
"gorm.io/gorm" //gorm v2用的是gorm.io这个新库,v1用的是老库
"gorm.io/gorm/schema"
)
// 方法1:mysql.New
func Test26() {
// mysql的Dialector创建准备
dsn := "root:111111@tcp(127.0.0.1:3306)/test1?charset=utf8mb4&parseTime=True&loc=Local"
mysqlConfig := mysql.Config{
DSN: dsn,
DefaultStringSize: 256,
}
dia := mysql.New(mysqlConfig) //新建一个Dialector,也就是Config指针
//2 gorm.Open,同时包括错误处理
if db1, err := gorm.Open(dia, &gorm.Config{
NamingStrategy: schema.NamingStrategy{ //禁用表名自动变复数
SingularTable: true,
},
}); err != nil { //.Open(Dialector的Config,gorm的Config)
errors.New("打开数据库失败") //这里go的错误处理的不行,还没理解到位
} else { // 3 如果连库成功,则查询第一个用户,输出
var user1 User
db1.First(&user1)
fmt.Println(user1)
fmt.Println(user1.Age)
}
}
// 方法2:mysql.Open,实际上是用了默认设置
func Test26() {
dsn := "root:111111@tcp(127.0.0.1:3306)/test1?charset=utf8mb4&parseTime=True&loc=Local"
dia := mysql.Open(dsn) //打开一个现有的Dialector方言
if db1, err := gorm.Open(dia, &gorm.Config{
NamingStrategy: schema.NamingStrategy{ //禁用表名自动变复数
SingularTable: true,
},
}); err != nil {
errors.New("打开数据库失败")
} else {
var user1 User
db1.First(&user1)
fmt.Println(user1)
fmt.Println(user1.Age)
}
}
参考:
https://learnku.com/docs/gorm/v2/connecting_to_the_database/9731
连库时的表名自动变复数问题?
变复数指的是:默认是表名+s/es,上例中默认表名是users,若是person变people而不是persons,总之按照英文复数来,很烦。
我不需要他变,禁掉需要设置NamingStrategy!
作为一个Java程序员,在我的编程规范里面,表名应该是单数而不是复数。名字代表其数据的性质(名称),而其里面的内容注定是不只有一条(不然也不用mysql了对吧)。所以没必要整个加长,增加存储负担。
设置方法,就是在gorm的第二个参数设置NamingStrategy:
gorm.Open(dia, &gorm.Config{
NamingStrategy: schema.NamingStrategy{ //设置NamingStrategy,禁掉表名自动变复数。
SingularTable: true,
},
});
参考:
https://juejin.cn/post/7054586954901356558
2、AutoMigrate
所谓 “迁移” 就是刷新
数据库中的表格定义
,使其保持最新(只增不减
)。
GORM 的 AutoMigrate() 方法用于自动迁移 ORM 的 Schemas。
db.AutoMigrate(&Product{})
AutoMigrate 会创建(新的)表、缺少的外键、约束、列和索引,并且会更改现有列的类型(如果其大小、精度、是否为空可更改的话)。但不会删除未使用的列,以保护现存的数据。
3、CRUD
// Create
db.Create(&Product{Code: "D42", Price: 100})
// Read
var product Product
db.First(&product, 1) // 根据整型主键查找
db.First(&product, "code = ?", "D42") // 查找 code 字段值为 D42 的记录
// Update - 将 product 的 price 更新为 200
db.Model(&product).Update("Price", 200)
// Update - 更新多个字段
db.Model(&product).Updates(Product{Price: 200, Code: "F42"}) // 仅更新非零值字段
db.Model(&product).Updates(map[string]interface{}{"Price": 200, "Code": "F42"})
// Delete - 删除 product
db.Delete(&product, 1)
其中,Update和Find需要Model。
Model方法
db := global.GVA_DB.Model(&model.ExperimentDefine{})
err = db.Where("id=?",info.ExpID).find(&expList).Error
https://learnku.com/docs/gorm/v2/index/9728 【文档,中文】
https://gorm.io/zh_CN/docs/index.html
https://blog.csdn.net/Jmilk/article/details/108967581
10、报错
github.com/mattn/go-sqlite3
cgo: exec gcc: exec: "gcc": executable file not found in %PATH%
原因是缺gcc编译器
安装gcc
下载地址:https://sourceforge.net/projects/mingw-w64/files/
往下拉,下载红框里的版本,别下载最新的,因为会安装失败。
解压后, 将mingw64\bin 加入环境变量即可,测试gcc -v
重新启动IDE
重新导入sqlit3
参考:
https://www.cnblogs.com/zsy/p/5958170.html
https://blog.csdn.net/kramer_1711/article/details/119416512【下载】
作者:西伯尔
出处:http://www.cnblogs.com/sybil-hxl/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。