Gorm: وجهة غير مدعومة ، يجب أن تكون شريحة أو هيكل

تم إنشاؤها على ١٩ يونيو ٢٠١٧  ·  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 ، ولا أريد استخدام البنية. Beacuse ، عندما أريد الحصول على نتيجة الانضمام ، أحتاج إلى إنشاء هيكل كبير جديد أو هيكل الحمولة. أعتقد أن الخريطة جيدة في هذا.

هل يمكن لأي شخص مساعدتي؟

التعليق الأكثر فائدة

ربما يمكن أن يكون هذا مفيدًا:

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 التقييمات