gpt4 book ai didi

sql - Gorm 在多对多插入中添加多个 slice

转载 作者:行者123 更新时间:2023-12-04 17:19:56 27 4
gpt4 key购买 nike

我是 go 和 gorm 的新手。我正在尝试在一个 SQL 查询中插入多个值。

我编写此查询是为了向用户添加多个对话:

relationUserConversation := make([][]uint, len(users))

for i, v := range users {
relationUserConversation[i] = []uint{conversation.ID, v}
}

result = r.db.Debug().Exec(
"INSERT INTO `user_has_conversations` (`user_has_conversations`.`conversation_id`, `user_has_conversations`.`user_id`) VALUES ?",
relationUserConversation, // If i do this it works relationUserConversation[0], relationUserConversation[1]
// The issue is because the query has this value "VALUES ((35,1),(35,2))", but should be to work (35,1),(35,2)
)

我还尝试将它直接添加到我想做的对话中,但是我在尝试添加多对多关系时遇到了问题,因为我没有创建用户和用户之间的关系它尝试添加用户的对话。

我的对话模型:

type Conversation struct {
ID uint `gorm:"primarykey"`
Users []*User `gorm:"many2many:user_has_conversations;"`
Messages []ConversationMessage
}

如果我可以在一个查询中创建与相关用户的新对话,而不是先创建对话,然后再创建与用户的关系,那就太好了。

最佳答案

下面是使用 Gorm Appends 方法 ( see documentation here ) 在两个(或更多)模型之间创建多对多关联的最小工作示例。希望您可以根据您的用例进行调整。

package main

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

type User struct {
gorm.Model
Name string
Conversations []Conversation `gorm:"many2many:user_conversations;"`
}

type Conversation struct {
gorm.Model
Name string
Users []*User `gorm:"many2many:user_conversations;"`
}

func main() {

db, err := gorm.Open(sqlite.Open("many2many.db"), &gorm.Config{})
if err != nil {
panic("failed to connect database")
}

// Migrate the schema
err = db.AutoMigrate(&User{}, &Conversation{})
if err != nil {
fmt.Print(err)
}

userOne := User{
Name: "User One",
}
userTwo := User{
Name: "User Two",
}
// Create users
db.Create(&userOne)
db.Create(&userTwo)

conversation := Conversation{
Name: "Conversation One",
}
// Create conversation
db.Create(&conversation)


// Append users
err = db.Model(&conversation).Association("Users").Append([]User{userOne, userTwo})

if err != nil {
fmt.Print(err)
}


for _, convUser := range conversation.Users {
fmt.Println("Hello I am in the conversation: " + convUser.Name)
}

// Clean up database
db.Delete(&userOne)
db.Delete(&userTwo)
db.Delete(&conversation)
}

查询次数

如果您在 Gorm 上启用 Debug():

err = db.Debug().Model(&conversation).Association("Users").Append([]User{userOne, userTwo})

它显示了这个:

[0.144ms] [rows:2] INSERT INTO `user_conversations`
(`conversation_id`,`user_id`) VALUES (8,15),(8,16) ON CONFLICT DO NOTHING

Values 部分是正确的(您尝试手动执行的操作)并使用 ORM 实现。

关于sql - Gorm 在多对多插入中添加多个 slice ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66778094/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com