如何使用 Go / GORM 在没有预定义结构的情况下打印 SELECT 查询输出

我正在开发一个 API,使用Go它连接到 MySQL 数据库以执行某些查询。正在GORM用于数据库操作。但是我坚持打印SELECT没有列名的表的查询输出。


我的用例是,我需要在多个表上运行查询,而我不知道它们的列名和类型是什么。因此,我无法为所有可能添加的当前和未来表预定义结构。


有没有办法在SELECT没有预定义的情况下打印/保存查询输出struct?


我尝试使用空结构做一些事情,但它对我没有帮助。


PS:我是围棋的初学者


    type Testing struct{}


    var test Testing

    dsn := fmt.Sprintf("%v:%v@tcp(%v:%v)/%v", myds.DBuser, myds.DBpassword, myds.DBhost, myds.DBport, myds.DBname)

    db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})

    if err != nil {

        fmt.Println(err)

    }

    tx := db.Raw(query).Scan(&test)

    if tx.Error != nil {

        fmt.Println(tx.Error)

    }

    fmt.Println(test)


忽然笑
浏览 374回答 2
2回答

莫回无

您可以使用匿名结构假设您有一个结构:type User struct{  FirstName string  LastName string}查询:SELECT CONCAT(first_name,last_name) AS full_name from users;注意新栏full_name你可以简单地做var fullName = struct{FullName string}{}请注意我如何使用 pascal 大小写 & FullName 必须是字段名称中间的大写字母将表示_字段是公共的,因此可以在外部访问。full_name(查询)= FullName(字段)将此 fullName 对象作为存储桶传递给您的扫描,它应该可以工作。db.Raw(查询).Scan(&全名)编辑:您的查询会有一些结果吗?让我假设你有column_one,column_two... column_n现在,要从所有列或选定的列中获取数据,您只需定义具有特定名称的字段(在匿名结构中)。在我们的例子中:struct{ColumnOne,ColumnTwo,..ColumnN interface{}}{}PS 我已经使用过interface{},您可以根据列返回的数据使用类型。

扬帆大鱼

它通过使用带有界面的地图类型为我工作。这帮助我保存了SELECT没有预定义结构或列名的查询结果。    dsn := fmt.Sprintf("%v:%v@tcp(%v:%v)/%v", myds.DBuser, myds.DBpassword, myds.DBhost, myds.DBport, myds.DBname)    db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})    if err != nil {        fmt.Println(err)    }    var result []map[string]interface{}    tx := db.Raw(query).Scan(&result)    if tx.Error != nil {        fmt.Println(tx.Error)        return    }    bytes, _ := json.Marshal(result)    fmt.Println(string(bytes))
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go