gorm基础03--CRUD 接口-创建

gorm基础03--CRUD 接口-创建,第1张

gorm基础03--CRUD 接口-创建 介绍案例说明

介绍

gorm基础02–人门指南-连接到数据库 介绍了gorm 连接数据库的方法,本文继上问继续介绍常见的创建数据记录的方法,具体包括创建表、插入数据、批量插入数据、通过map方式插入数据等。

案例

在gorm中,表名是结构体名的复数形式,列名是字段名的蛇形小写。
即,如果有一个user表,那么如果你定义的结构体名为:User,gorm会默认表名为users而不是user。
如果需要创建单数的表,那么需要在 gorm.Config中配置 SingularTable: true。

源码:

package main

import (
	"database/sql"
	"fmt"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"gorm.io/gorm/schema"
	"time"
)

type User struct {
	ID           uint
	Name         string
	Email        string
	Age          uint8
	Birthday     time.Time
	MemberNumber sql.NullString
	ActivatedAt  sql.NullTime
	CreatedAt    time.Time
	UpdatedAt    time.Time
}

func getDb() *gorm.DB {
	db, err := gorm.Open(mysql.New(mysql.Config{
		DSN:                       "root:111111@tcp(127.0.0.1:3306)/gorm?charset=utf8&parseTime=True&loc=Local", // DSN data source name
		DefaultStringSize:         256,                                                                          // string 类型字段的默认长度
		DisableDatetimePrecision:  true,                                                                         // 禁用 datetime 精度,MySQL 5.6 之前的数据库不支持
		DontSupportRenameIndex:    true,                                                                         // 重命名索引时采用删除并新建的方式,MySQL 5.7 之前的数据库和 MariaDB 不支持重命名索引
		DontSupportRenameColumn:   true,                                                                         // 用 `change` 重命名列,MySQL 8 之前的数据库和 MariaDB 不支持重命名列
		SkipInitializeWithVersion: false,                                                                        // 根据当前 MySQL 版本自动配置
	}), &gorm.Config{NamingStrategy: schema.NamingStrategy{SingularTable: true}})
	fmt.Printf("getDb db=%v, err=%v\n", db, err)
	return db
}

func createTable(db *gorm.DB) {
	db.AutoMigrate(&User{}) // 创建一份表结构
	user := User{Name: "Jinzhu", Age: 18, Birthday: time.Now()}
	db.Create(&user) // 通过数据的指针来创建
	db.Select("Name", "Age", "CreatedAt").Create(&user)
}

func dbOmit(db *gorm.DB) {
	user := User{Name: "Jinzhu", Age: 18, Birthday: time.Now()}
	// Omit 和 Create || Select 同时使用会报错  Duplicate entry 'xx' for key 'PRIMARY'
	db.Omit("Name", "Age", "CreatedAt").Create(&user)
}

func insertMany(db *gorm.DB) {
	var users = []User{{Name: "jinzhu1", Birthday: time.Now()},
		{Name: "jinzhu2", Birthday: time.Now()},
		{Name: "jinzhu3", Birthday: time.Now()},
	}
	db.Create(&users)

	for _, user := range users {
		fmt.Println(user.ID)
	}
}

func insertInBatches(db *gorm.DB) {
	var users = []User{
		{Name: "jinzhu_101", Birthday: time.Now()},
		{Name: "jinzhu_102", Birthday: time.Now()},
		{Name: "jinzhu_103", Birthday: time.Now()},
		{Name: "jinzhu_104", Birthday: time.Now()},
	}
	// 数量为 2
	db.CreateInBatches(users, 2)
}

func insertByMap(db *gorm.DB) {
	db.Model(&User{}).Create(map[string]interface{}{
		"Name": "map_1", "Age": 18,
	})
	// batch insert from `[]map[string]interface{}{}`
	db.Model(&User{}).Create([]map[string]interface{}{
		{"Name": "map_2.1", "Age": 18},
		{"Name": "map_2.2", "Age": 20},
	})
}

func main() {
	db := getDb()
	createTable(db)
	dbOmit(db)
	insertMany(db)
	insertInBatches(db)
	insertByMap(db)
}

测试:

getDb db=&{0xc0001cc480 <nil> 0 0xc0000aa000 1}, err=<nil>
4
5
6

user 表中的数据:

说明

gorm官方文档 CRUD 接口-创建
go gorm取消表名s

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/995180.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-21
下一篇 2022-05-21

发表评论

登录后才能评论

评论列表(0条)

保存