gorm实现MySQL的INSERT INTO ... ON DUPLICATE KEY UPDATE差异化插入和更新

比如插入 f_create_uid,更新时忽略 f_create_uid,只更新 f_update_uid。可使用 gorm 的 BeforeCreate 和 BeforeUpdate 钩子,这两个钩子分别在创建和更新记录之前被调用。

// BeforeCreate 在创建记录之前调用
func (dob *MyStruct) BeforeCreate(tx *gorm.DB) (err error) {
    dob.CreateUid = // 设置创建人id
    dob.UpdateUid = // 设置更新人id
    // 使用 dob 值更新:
    //tx.Statement.SetColumn("f_create_uid", dob.CreateUid) // 钩子中被调用,第三个参数不需要指定为 true
    return
}

// BeforeUpdate 在更新记录之前调用
func (dob *MyStruct) BeforeUpdate(tx *gorm.DB) (err error) {
    dob.UpdateUid = // 设置更新人id
    return
}

注册和应用钩子:

// 注册钩子
db.Callback().Create().Before("gorm:create").Register("before_create", func(db *gorm.DB) {
    if dob, ok := db.Statement.Dest.(MyStruct); ok {
        dob.BeforeCreate(db)
    }
})

db.Callback().Update().Before("gorm:update").Register("before_update", func(db *gorm.DB) {
    if dob, ok := db.Statement.Dest.(MyStruct); ok {
        dob.BeforeUpdate(db)
    }
})

// 批量插入或更新(在冲突时更新除主键以外的所有列到新值)
db := tx.Model(&MyStruct{})
db = db.Omit("f_id", "f_update_time", "f_create_time", "f_memo")
db = db.Clauses(clause.OnConflict{UpdateAll: true})
err := db.Create(me).Error
if err != nil {
    fmt.Printf("InsertOrUpdate error: %s", err.Error())
    return nil, err
}

取消注册的钩子:

// 取消注册 BeforeCreate 钩子
db.Callback().Create().Before("gorm:create").Unregister("before_create")

// 取消注册 BeforeUpdate 钩子
db.Callback().Update().Before("gorm:update").Unregister("before_update")

示例:

package main

import (
    "fmt"
    "gorm.io/driver/mysql"
    "gorm.io/gorm"
)

type User struct {
    Id   int
    Name string
}

func (u *User) BeforeCreate(tx *gorm.DB) (err error) {
    fmt.Printf("name: %s\n", u.Name)
    tx.Statement.SetColumn("name", u.Name)
    return
}

//func (u *User) BeforeSave(tx *gorm.DB) (err error) {
//    u.Name = "Sally"
//    return
//}

func main() {
    dsn := "user:password@tcp(host:port)/dbname?charset=utf8mb4&parseTime=true&loc=Asia%2FShanghai"
    db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
    if err != nil {
        panic("failed to connect database")
    }

    // 注册 BeforeCreate 钩子
    db.Callback().Create().Before("gorm:create").Register("before_create", func(db *gorm.DB) {
        if user, ok := db.Statement.Dest.(*User); ok {
            user.BeforeCreate(db)
        }
    })

    // 注册 BeforeSave 钩子
    //db.Callback().Save().Before("gorm:save").Register("before_save", func(db *gorm.DB) {
    //    if user, ok := db.Statement.Dest.(*User); ok {
    //        user.BeforeSave(db)
    //    }
    //})

    db.AutoMigrate(&User{})
    user := User{
        Name: "Blake",
    }
    err = db.Create(&user).Error
    if err != nil { 
        panic(err)
    }
    fmt.Println(user.Name)
}
本文利用ABB自主开发的Robot Studio离线模拟软件对涂料生产线进行了模拟,并对其反复定位精度、颜色清洁等方面进行了深入的探讨。首先,叙述了涂料生产线的功能、历史、工艺流程,并对其发展过程、特点、研究背景、研究意义作了简要的介绍。本文对喷漆机器人着色系统的硬件组成、换色与清洁机理进行了分析,并对其引起的问题及影响因素进行了分析,并进行了预处理软件的设计。对机器人在喷涂过程中容易产生的漆膜问题进行了研究,并对产生的原因进行了分析,并提出了解决办法。并对静电电压、成型空气等各工艺参数的影响进行了分析。其次,对机器人的姿态重复度姿态精度进行了分析,提出了用雅可比矩阵表达机器人各个关节轴线的角速度与速度的关系;本文对离线编程技术的发展状况进行了分析,并对离线程序的各模块及界面的作用进行了详细的说明,并给出了离线编程的整体设计思路。最后,在Robot Studio仿真软件的基础上,通过Robot Studio仿真软件实现了涂装流水线工作站的布置,建立了工件坐标系、工具坐标系、离线输送系统模块、喷涂模型仿形模块。### 基于Robot Studio的工业机器人汽车喷涂仿真设计#### 一、引言近年来,随着汽车行业的快速发展,消费者对于汽车的外观性能提出了更高的要求。为了满足市场需求,提高生产效率并降低生产成本,各大汽车制造商纷纷对传统油漆生产线进行改造升级。在这个背景下,喷射机器人因其高效性、精确性可靠性而在汽车涂装生产线上扮演着关键角色。本研究旨在通过ABB自主开发的Robot Studio离线模拟软件来实现汽车喷涂生产线的仿真设计,重点讨论了机器人的重复定位精度、颜色清洁等方面的优化方案。#### 二、涂料生产线概述##### 2.1 功能与历史涂料生产线主要用于汽车表面涂层的加工,它能够根据不同的需求进行多层涂装。随着技术进步,现代涂料生产线不仅提高了生产效率,还降低了能耗环境污染。##### 2.2 工艺流程涂料生产线的工艺流程一般包括预处理、电泳、中涂、面漆等多个环节。其中,预处理主要是去除车身表面的油污其他杂质;电泳则是通过电流将涂料均匀地附着在车身上;中涂面漆则负责赋予汽车美观的外观。#### 三、喷漆机器人着色系统分析##### 3.1 硬件组成喷漆机器人的硬件主要包括喷枪、颜色更换装置、清洗系统等部件。喷枪用于喷射涂料;颜色更换装置使得机器人能够在不同颜色之间快速切换;清洗系统则保证了喷枪在每次更换颜色后都能得到彻底清洁。##### 3.2 换色与清洁机理喷漆机器人通过更换不同的喷嘴或者内部管道来实现颜色的快速切换。在更换颜色前后,需要对喷枪进行彻底清洁以避免颜色污染。通常采用压缩空气或溶剂进行清洗。##### 3.3 影响因素影响喷漆机器人性能的因素主要包括涂料种类、喷涂压力、喷枪与工件之间的距离等。这些因素都会直接影响到喷涂效果的质量。#### 四、漆膜问题研究在实际喷涂过程中,可能会遇到各种漆膜问题,如流挂、橘皮现象、针孔等。这些问题通常是由涂料黏度、喷涂速度、环境温度等因素引起的。为解决这些问题,可以通过调整涂料配方、优化喷涂参数等方式来进行改进。#### 五、离线编程技术##### 5.1 发展现状离线编程技术是指在不占用实际生产设备的情况下,通过计算机软件预先编写模拟机器人运行程序的技术。随着计算机技术的发展,离线编程已经成为提高生产效率的重要手段之一。##### 5.2 雅可比矩阵应用雅可比矩阵是描述机器人各关节轴线角速度与末端执行器速度关系的一种数学工具。通过计算雅可比矩阵,可以更准确地控制机器人的运动轨迹,从而提高其重复定位精度姿态精度。##### 5.3 整体设计思路离线编程的整体设计思路主要包括任务规划、路径规划程序生成三个阶段。其中,任务规划阶段确定机器人的工作任务;路径规划阶段根据任务要求计算出机器人的运动轨迹;程序生成阶段则是将规划好的轨迹转化为机器人可以执行的指令。#### 六、Robot Studio仿真软件应用##### 6.1 工作站布局利用Robot Studio软件可以实现涂装流水线工作站的虚拟布局,包括工件坐标系、工具坐标系等的设定。##### 6.2 模型仿真通过建立喷涂模型仿形模块,可以在软件中模拟整个喷涂过程,从而验证设计方案的有效性。#### 七、结论通过对喷漆机器人及其在汽车涂装生产线中应用的研究,本文不仅介绍了涂料生产线的基本情况发展趋势,还深入探讨了喷漆机器人着色系统的工作原理、漆膜问题及其解决方案等内容。利用Robot Studio软件进行离线编程仿真,不仅可以提高生产效率,还能有效减少生产成本,具有重要的理论实践意义。
数据简介上市公司-上下游供应链协同创新数据是围绕上市公司这一核心企业,记录其与供应链上游供应商、下游客户在协同创新过程中产生的各类数据集合。这些数据反映了上市公司与供应链伙伴在技术创新、产品创新、管理创新等方面的合作深度与广度,是评估供应链协同创新效果、优化供应链管理、提升企业竞争力的重要依据。本数据包含:最终结果(供应商版/客户版),代码do文件 ,合并后的供应链专利数据,重构后的客户/供应商数据。数据名称:上市公司-上下游供应链协同创新数据数据年份:2013-2024年数据来源:专利合作数据来源于incopat;供应链数据来源于公司官网参考文献:[1]马从文,湛泳.供应链溢出视角下美国实体清单制裁对企业协同创新的影响[J/OL].科技进步与对策,1-11[2025-08-21].相关数据供应链专利:序号 标题 (英文) 摘要 (英文) 公开(公告)号 标题 (中文) 摘要 (中文) 申请人 公开(公告)日 申请号 申请日 公开类型 专利类型 公开国别 链接到incoPat IPC主分类 IPC 国民经济分类 国民经济行业(主) 申请人类型 申请人数量 申请人国家/地区 申请人地址 工商注册地址 引证专利 被引证专利 来源文件 学科分类 中国申请人区县 申请人省市代码 中国申请人地市协同创新数据(供应商、客户):供应商名称 供应商代码 年份 合作次数 中游公司代码1 中游公司名称1 中游公司代码2 中游公司名称2 中游公司代码3 中游公司名称3 中游公司代码4 中游公司名称4 中游公司代码5 中游公司名称5 中游公司代码6 中游公司名称6 客户名称 客户代码 年份 合作次数 中游公司代码1 中游公司名称1 中游公司代码2 中游公司名称2 中游公司代码3 中游公司名称3 中游公司代码4 中游公司名称4供应商客户数据:供应商名称
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值