Gorm: 不受支持的目的地,应该是切片或结构

创建于 2017-06-19  ·  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 中搜索一些行,我不想使用 struct。 因为,当我想得到一个连接结果时,我需要创建一个新的大结构或有效负载结构。 我认为地图在这方面很好。

任何人都可以帮助我吗?Thx

最有用的评论

也许这会有所帮助:

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 等级

相关问题

satb picture satb  ·  3评论

koalacxr picture koalacxr  ·  3评论

hypertornado picture hypertornado  ·  3评论

superwf picture superwf  ·  3评论

fieryorc picture fieryorc  ·  3评论