登录
首页 >  Golang >  Go问答

无需预定义结构,使用 Go / GORM 打印 SELECT 查询输出的方法

来源:stackoverflow

时间:2024-02-15 18:57:23 218浏览 收藏

学习知识要善于思考,思考,再思考!今天golang学习网小编就给大家带来《无需预定义结构,使用 Go / GORM 打印 SELECT 查询输出的方法》,以下内容主要包含等知识点,如果你正在学习或准备学习Golang,就都不要错过本文啦~让我们一起来看看吧,能帮助到你就更好了!

问题内容

我正在使用 go 开发一个 api,它连接到 mysql 数据库以执行某些查询。我使用 gorm 进行数据库操作。但我一直坚持打印没有列名的表的 select 查询输出。

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

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

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

p.s:我是 go 初学者

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)

正确答案


它通过使用带有界面的地图类型对我有用。这帮助我保存了 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))

您可以使用匿名结构

假设您有一个结构

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}{}

注意我如何使用帕斯卡大小写且 fullname 必须是字段名称
中间的大写字母代表 _
字段是公共的,因此可以从外部访问。

全名(查询)= 全名(字段)

将此 fullname 对象作为存储桶传递给您的 scan,它应该可以工作。

db.raw(查询).scan(&fullname)

编辑

您的查询会有一些结果吗?
让我假设你有

column_one,column_two... column_n

现在,要从所有列或选定的列(如果需要)获取数据,您只需定义具有特定名称的字段(在匿名结构中)即可。在我们的例子中:

struct{ColumnOne,ColumnTwo,..ColumnN interface{}}{}

附注我使用了 interface{},您可以根据列返回的数据使用类型。

本篇关于《无需预定义结构,使用 Go / GORM 打印 SELECT 查询输出的方法》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于Golang的相关知识,请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>