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【下载】

posted on 2022-03-03 18:37  西伯尔  阅读(470)  评论(0编辑  收藏  举报