如何使用GORM插入select?

z9gpfhce  于 2022-12-07  发布在  Go
关注(0)|答案(1)|浏览(245)

有没有办法使用GORM在单个查询中插入(创建)带有select的行?
我尝试做的是连接两个表,并使用从表中选择的值(使用insert/select)将行插入到另一个表中,但我很难找到一种方法来使用GORM同时调用create和select。
基本上我希望做什么可以在下面的SQL查询:

INSERT INTO table_two (val, name, age)
SELECT table_one.some_value, '', 0
FROM table_one
WHERE table_one.some_value = 50

这会将新数据列插入table_two,并将val数据行值设定为table_one中每个相符数据列的some_value
先谢谢你。

fnvucqvd

fnvucqvd1#

我可以通过两种方式实现你的要求。
第一种方法是使用原始SQL查询(与您在问题中提供的查询相同)。多亏了db.Exec()函数,您可以对MySQL示例运行原始SQL语句。
第二种方法是将操作拆分为两个部分:
1.首先,使用WhereFind读取数据
1.第二步,使用Create插入数据
下面,您可以找到这两种解决方案:

package main

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

type TableOne struct {
    SomeValue int
    Name      string
    Age       int
}

type TableTwo struct {
    Val  int
    Name string
    Age  int
}

func main() {
    // refer https://github.com/go-sql-driver/mysql#dsn-data-source-name for details
    dsn := "root:root@tcp(127.0.0.1:3306)/todo?charset=utf8mb4&parseTime=True&loc=Local"
    db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
    if err != nil {
        panic(err)
    }

    // first approach - Raw SQL
    if dbTrn := db.Exec(`INSERT INTO table_twos (val, name, age)
    SELECT table_ones.some_value, '', 0
    FROM table_ones
    WHERE table_ones.some_value = 50`).Error; dbTrn != nil {
        panic(dbTrn.Error)
    }

    // second approach - split into two actions
    var recordsOne []TableOne
    recordsTwo := make([]TableTwo, 0)
    db.Where("some_value=?", 50).Find(&recordsOne)
    for _, v := range recordsOne {
        recordsTwo = append(recordsTwo, TableTwo{Val: v.SomeValue, Name: "", Age: 0})
    }
    db.Create(&recordsTwo)
}

让我知道这是否也适用于你。

相关问题