Gorm: サポートされていない宛先、スライスまたは構造体である必要があります

作成日 2017年06月19日  ·  3コメント  ·  ソース: go-gorm/gorm

どのバージョンのGoを使用していますか( go version )?

golang 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{})に変更してみてください。
構造体とスライスのみが許可されていると思いますが。
マップでは機能しないと思います。

thx @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 評価

関連する問題

bramp picture bramp  ·  3コメント

Ganitzsh picture Ganitzsh  ·  3コメント

sredxny picture sredxny  ·  3コメント

hypertornado picture hypertornado  ·  3コメント

leebrooks0 picture leebrooks0  ·  3コメント