介绍
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 表中的数据: