Gorm: неподдерживаемый пункт назначения, должен быть фрагментом или структурой

Созданный на 19 июн. 2017  ·  3Комментарии  ·  Источник: go-gorm/gorm

Какую версию Go вы используете ( go version )?

голанг 1.8.3

Какую базу данных и ее версию вы используете?

MySQL 5.6

Что ты сделал?

Пожалуйста, предоставьте полную работоспособную программу для воспроизведения вашей проблемы.

package main

import (
    "fmt"

    _ "github.com/go-sql-driver/mysql"
    "github.com/jinzhu/gorm"
)

var db *gorm.DB

func find(v *map[string]interface{}) {

}

func main() {
    var err error
    db, err = gorm.Open("mysql", "***")
    if err != nil {
        panic(err)
    }
    var user map[string]interface{}
    db.Debug().Table("test").Find(&user)
    fmt.Println(user)
}

Как эта демонстрация. Я хочу найти некоторые строки из mysql, и я не хочу использовать структуру. Поскольку, когда я хочу получить результат соединения, мне нужно создать новую большую структуру или структуру полезной нагрузки. Я думаю, что карта хороша в этом.

Любые ребята могут мне помочь? Спасибо

Самый полезный комментарий

Может быть, это может помочь:

package main

import (
    "fmt"
    "reflect"

    "github.com/jinzhu/gorm"
    _ "github.com/mattn/go-sqlite3"
)

type Project struct {
    gorm.Model
    Name string `gorm:"type:varchar(200)"`
}

func main() {
    db, _ := gorm.Open("sqlite3", "db.sqlite3?cache=shared&mode=rwc")
    db.AutoMigrate(&Project{})

    db.Create(&Project{Name: "A"}) // Demo record inserted

    // Now I would like to use reflection to be able to make a generic function
    t := reflect.TypeOf(Project{})
    fmt.Println(t)

    single := reflect.New(t).Interface()
    db.Debug().Table("projects").First(single)
    fmt.Printf("Single result > %+v\n", single) // Works with a single instance

    multiple := reflect.MakeSlice(reflect.SliceOf(t), 0, 10)
    db.Debug().Table("projects").Find(&multiple)       // Log show table and records are found
    fmt.Printf("1. Multiple result > %+v\n", multiple) // But, multiple is empty

    // Instead:

    // Create a pointer to a slice value and set it to the slice
    // multiple := reflect.MakeSlice(reflect.SliceOf(t), 0, 10)
    multiplepointer := reflect.New(multiple.Type())
    multiplepointer.Elem().Set(multiple)

    db.Debug().Table("projects").Find(multiplepointer.Interface())
    fmt.Printf("2. Multiple result > %+v\n", multiplepointer) // multiplepointer contains rows
}

Все 3 Комментарий

Вы не инициализировали структуру пользователя.
Попробуйте изменить его на var user = make(map[string]interface{}) .
Хотя я думаю, что разрешены только структуры и срезы.
Я не думаю, что это работает с картами.

спасибо @ktsakas . Я пробовал ваше предложение. Но это не сработало. Я думаю, вы правы, это только структура или срезы.

Может быть, это может помочь:

package main

import (
    "fmt"
    "reflect"

    "github.com/jinzhu/gorm"
    _ "github.com/mattn/go-sqlite3"
)

type Project struct {
    gorm.Model
    Name string `gorm:"type:varchar(200)"`
}

func main() {
    db, _ := gorm.Open("sqlite3", "db.sqlite3?cache=shared&mode=rwc")
    db.AutoMigrate(&Project{})

    db.Create(&Project{Name: "A"}) // Demo record inserted

    // Now I would like to use reflection to be able to make a generic function
    t := reflect.TypeOf(Project{})
    fmt.Println(t)

    single := reflect.New(t).Interface()
    db.Debug().Table("projects").First(single)
    fmt.Printf("Single result > %+v\n", single) // Works with a single instance

    multiple := reflect.MakeSlice(reflect.SliceOf(t), 0, 10)
    db.Debug().Table("projects").Find(&multiple)       // Log show table and records are found
    fmt.Printf("1. Multiple result > %+v\n", multiple) // But, multiple is empty

    // Instead:

    // Create a pointer to a slice value and set it to the slice
    // multiple := reflect.MakeSlice(reflect.SliceOf(t), 0, 10)
    multiplepointer := reflect.New(multiple.Type())
    multiplepointer.Elem().Set(multiple)

    db.Debug().Table("projects").Find(multiplepointer.Interface())
    fmt.Printf("2. Multiple result > %+v\n", multiplepointer) // multiplepointer contains rows
}

Была ли эта страница полезной?
0 / 5 - 0 рейтинги