Я написал пример кода, как вы описали, и перевел Gorm в режим журнала, чтобы увидеть SQL, но он печатает правильные SQL:
[2020-03-29 21:29:42] [0.17ms] SELECT * FROM "post_models"
[4 rows affected or returned ]
[2020-03-29 21:29:42] [0.18ms] SELECT * FROM "user_models" WHERE ("id" IN (1,2,1,3))
[3 rows affected or returned ]
Как видите, запросы верны.
package main
import (
"fmt"
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/sqlite"
"log"
"os"
)
type PostModel struct {
Id int64 `gorm:"primary_key;column:id"`
UserId *int64 `gorm:"column:userId;"`
User UserModel `gorm:"ForeignKey:UserId"`
}
type UserModel struct {
Id int64 `gorm:"primary_key;column:id"`
}
func preloadingSample() error {
_ = os.Remove("test.db") // Remove file to make sure DB is empty
db, err := gorm.Open("sqlite3", "test.db")
if err != nil {
return fmt.Errorf("open DB failed: %w", err)
}
defer db.Close()
db.LogMode(true)
err = db.AutoMigrate(
&PostModel{},
&UserModel{},
).Error
if err != nil {
return fmt.Errorf("migration failed: %w", err)
}
// Put some sample data in DB
sampleUsers := []UserModel{
{},
{},
{},
}
for idx := range sampleUsers {
err = db.Create(&sampleUsers[idx]).Error
if err != nil {
return fmt.Errorf("failed to create: %w", err)
}
}
samplePosts := []PostModel{
{User: sampleUsers[0]},
{User: sampleUsers[1]},
{User: sampleUsers[0]},
{User: sampleUsers[2]},
}
for idx := range samplePosts {
err = db.Create(&samplePosts[idx]).Error
if err != nil {
return fmt.Errorf("failed to create: %w", err)
}
}
var posts []PostModel
err = db.Preload("User").Find(&posts).Error
if err != nil {
return fmt.Errorf("error in find: %w", err)
}
fmt.Printf("%+v\n", posts)
return nil
}
func main() {
err := preloadingSample()
if err != nil {
log.Fatal(err)
}
}