GORM常用的插入

GORM常用的插入创建记录 package main import database sql fmt gorm io driver mysql gorm io gorm gorm io gorm logger log

大家好,我是讯享网,很高兴认识大家。

创建记录

package main import ( "database/sql" "fmt" "gorm.io/driver/mysql" "gorm.io/gorm" "gorm.io/gorm/logger" "log" "os" "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 main() { 
    // 连接对应的数据库 dsn := "root:root@tcp(192.168.193.128:3306)/grom_test?charset=utf8mb4&parseTime=True&loc=Local" newLogger := logger.New( log.New(os.Stdout, "\r\n", log.LstdFlags), // io writer(日志输出的目标,前缀和日志包含的内容——译者注) logger.Config{ 
    SlowThreshold: time.Second, // 慢 SQL 阈值 LogLevel: logger.Info, // 日志级别 IgnoreRecordNotFoundError: true, // 忽略ErrRecordNotFound(记录未找到)错误 Colorful: true, // 使用用彩色打印 }, ) db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{ 
   Logger: newLogger}) if err != nil { 
    panic(err) } birthday := time.Now() user := User{ 
   Name: "Jinzhu", Age: 18, Birthday: &birthday} result := db.Create(&user) // 通过数据的指针来创建 // 1 fmt.Println(user.ID) // 返回插入数据的主键 // <nil> fmt.Println(result.Error) // 返回 error // 1 fmt.Println(result.RowsAffected) // 返回插入记录的条数 } 

讯享网

日志:

讯享网INSERT INTO `users` (`name`,`email`,`age`,`birthday`,`member_number`,`activated_at`,`created_at`,`updated_at`) VALUES ('Jinzhu',NULL,18,'2022-05-26 16:34:40.986',NULL,NULL,'2022-05-26 16:34:40.988','2022-05-26 16:34:40.988') 

用指定的字段创建记录

创建记录并更新给出的字段

package main import ( "database/sql" "fmt" "gorm.io/driver/mysql" "gorm.io/gorm" "gorm.io/gorm/logger" "log" "os" "time" ) // 省略表结构 func main() { // 省略连接数据库代码 birthday := time.Now() user := User{Name: "Jinzhu", Age: 18, Birthday: &birthday} db.Select("Name", "Age", "CreatedAt").Create(&user) // 创建记录并更新给出的字段。 } 

日志:

讯享网INSERT INTO `users` (`name`,`age`,`created_at`,`updated_at`) VALUES ('Jinzhu',18,'2022-05-26 16:39:00.906','2022-05-26 16:39:00.906') 

创建一个记录且一同忽略传递给略去的字段值。

package main import ( "database/sql" "fmt" "gorm.io/driver/mysql" "gorm.io/gorm" "gorm.io/gorm/logger" "log" "os" "time" ) // 省略表结构 func main() { // 省略连接数据库代码 birthday := time.Now() user := User{Name: "Jinzhu", Age: 18, Birthday: &birthday} db.Omit("Name", "Age", "CreatedAt").Create(&user) // 创建一个记录且一同忽略传递给略去的字段值。 } 

日志:

讯享网INSERT INTO `users` (`email`,`birthday`,`member_number`,`activated_at`,`updated_at`) VALUES (NULL,'2022-05-26 16:39:00.904',NULL,NULL,'2022-05-26 16:39:00.906') 

创建钩子

GORM 允许用户定义的钩子有 BeforeSave, BeforeCreate, AfterSave, AfterCreate 创建记录时将调用这些钩子方法,请参考 Hooks中关于生命周期的详细信息

func (u *User) BeforeCreate(tx *gorm.DB) (err error) { 
    u.UUID = uuid.New() if u.Role == "admin" { 
    return errors.New("invalid role") } return } 

如果想跳过 钩子 方法,可以使用 SkipHooks 会话模式,例如:

讯享网DB.Session(&gorm.Session{ 
   SkipHooks: true}).Create(&user) DB.Session(&gorm.Session{ 
   SkipHooks: true}).Create(&users) DB.Session(&gorm.Session{ 
   SkipHooks: true}).CreateInBatches(users, 100) 

批量插入

要有效地插入大量记录,请将一个 slice 传递给 Create 方法。 GORM 将生成单独一条SQL语句来插入所有数据,并回填主键的值,钩子方法也会被调用。

一次性插入

package main import ( "database/sql" "fmt" "gorm.io/driver/mysql" "gorm.io/gorm" "gorm.io/gorm/logger" "log" "os" "time" ) // 省略表结构 func main() { 
    // 省略连接数据库代码 var users = []User{ 
   { 
   Name: "jinzhu1"}, { 
   Name: "jinzhu2"}, { 
   Name: "jinzhu3"}} db.Create(&users) for _, user := range users { 
    // 5 6 7 fmt.Println(user.ID) } } 

日志:

讯享网INSERT INTO `users` (`name`,`email`,`age`,`birthday`,`member_number`,`activated_at`,`created_at`,`updated_at`) VALUES ('jinzhu1',NULL,0,NULL,NULL,NULL,'2022-05-26 17:09:15.298','2022-05-26 17:09:15.298'),('jinzhu2',NULL,0,NULL,NULL,NULL,'2022-05-26 17:09:15.298','2022-05-26 17:09:15.298'),('jinzhu3',NULL,0,NULL,NULL,NULL,'2022-05-26 17:09:15.298','2022-05-26 17:09:15.298') 

分批插入

SQL语句的长度是有限制的;如果一次性插入的数据量过大,有可能会执行不了;可以采用分批插入;


讯享网

package main import ( "database/sql" "fmt" "gorm.io/driver/mysql" "gorm.io/gorm" "gorm.io/gorm/logger" "log" "os" "time" ) // 省略表结构 func main() { 
    // 省略连接数据库代码 var users = []User{ 
   { 
   Name: "jinzhu1"}, { 
   Name: "jinzhu2"}, { 
   Name: "jinzhu3"}} // 每两条插入一次 db.CreateInBatches(users, 2) for _, user := range users { 
    // 8 9 10 fmt.Println(user.ID) } } 

日志:

讯享网INSERT INTO `users` (`name`,`email`,`age`,`birthday`,`member_number`,`activated_at`,`created_at`,`updated_at`) VALUES ('jinzhu1',NULL,0,NULL,NULL,NULL,'2022-05-26 17:11:49.606','2022-05-26 17:11:49.606'),('jinzhu2',NULL,0,NULL,NULL,NULL,'2022-05-26 17:11:49.606','2022-05-26 17:11:49.606') INSERT INTO `users` (`name`,`email`,`age`,`birthday`,`member_number`,`activated_at`,`created_at`,`updated_at`) VALUES ('jinzhu3',NULL,0,NULL,NULL,NULL,'2022-05-26 17:11:49.608','2022-05-26 17:11:49.608') 

根据 Map 创建

GORM 支持根据 map[string]interface{} 和 []map[string]interface{}{} 创建记录;
注意: 根据 map 创建记录时,association 不会被调用,且主键也不会自动填充

插入单条

package main import ( "database/sql" "fmt" "gorm.io/driver/mysql" "gorm.io/gorm" "gorm.io/gorm/logger" "log" "os" "time" ) // 省略表结构 func main() { 
    // 省略连接数据库代码 db.Model(&User{ 
   }).Create(map[string]interface{ 
   }{ 
    "Name": "jinzhu", "Age": 18, }) } 

日志:

讯享网INSERT INTO `users` (`age`,`name`) VALUES (18,'jinzhu') 

批量插入

package main import ( "database/sql" "fmt" "gorm.io/driver/mysql" "gorm.io/gorm" "gorm.io/gorm/logger" "log" "os" "time" ) // 省略表结构 func main() { 
    // 省略连接数据库代码 db.Model(&User{ 
   }).Create([]map[string]interface{ 
   }{ 
    { 
   "Name": "jinzhu_1", "Age": 18}, { 
   "Name": "jinzhu_2", "Age": 20}, }) } 

日志:

讯享网INSERT INTO `users` (`age`,`name`) VALUES (18,'jinzhu_1'),(20,'jinzhu_2') 

关联创建

关联创建

package main import ( "database/sql" "fmt" "gorm.io/driver/mysql" "gorm.io/gorm" "gorm.io/gorm/logger" "log" "os" "time" ) type CreditCard struct { 
    gorm.Model Number string UserID uint } 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 CreditCard CreditCard } func main() { 
    // 省略连接数据库代码 db.Create(&User{ 
    Name: "jinzhu", CreditCard: CreditCard{ 
   Number: "1"}, }) } 

日志:

讯享网INSERT INTO `credit_cards` (`created_at`,`updated_at`,`deleted_at`,`number`,`user_id`) VALUES ('2022-05-26 17:21:24.763','2022-05-26 17:21:24.763',NULL,'1',20) ON DUPLICATE KEY UPDATE `user_id`=VALUES(`user_id`) INSERT INTO `users` (`name`,`email`,`age`,`birthday`,`member_number`,`activated_at`,`created_at`,`updated_at`) VALUES ('jinzhu',NULL,0,NULL,NULL,NULL,'2022-05-26 17:21:24.761','2022-05-26 17:21:24.761') 

跳过指定关联

package main import ( "database/sql" "fmt" "gorm.io/driver/mysql" "gorm.io/gorm" "gorm.io/gorm/logger" "log" "os" "time" ) // 省略表结构 func main() { 
    // 省略连接数据库代码 db.Omit("CreditCard").Create(&User{ 
   Name: "jinzhu"}) } 

日志:

讯享网INSERT INTO `users` (`name`,`email`,`age`,`birthday`,`member_number`,`activated_at`,`created_at`,`updated_at`) VALUES ('jinzhu',NULL,0,NULL,NULL,NULL,'2022-05-26 17:25:34.453','2022-05-26 17:25:34.453') 

跳过所有关联

package main import ( "database/sql" "fmt" "gorm.io/driver/mysql" "gorm.io/gorm" "gorm.io/gorm/logger" "log" "os" "time" ) // 省略表结构 func main() { 
    // 省略连接数据库代码 db.Omit(clause.Associations).Create(&User{ 
   Name: "jinzhu"}) } 

日志:

讯享网INSERT INTO `users` (`name`,`email`,`age`,`birthday`,`member_number`,`activated_at`,`created_at`,`updated_at`) VALUES ('jinzhu',NULL,0,NULL,NULL,NULL,'2022-05-26 17:27:12.382','2022-05-26 17:27:12.382') 
小讯
上一篇 2025-01-18 10:39
下一篇 2025-01-16 11:55

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/38876.html