当前位置: 首页 > 面试题库 >

Golang的SQL程序包不能进行临时/探索性查询吗?

张亦
2023-03-14
问题内容

根据文档,在Go中从数据库中获取数据的唯一方法似乎是使用Rows.Scan(),这意味着您必须在编译时知道所有列的数量和类型。

我想念什么吗?您应该如何支持即席查询?甚至将所有列从将来可能更改的表中拉出来?


问题答案:

sql.Rows类型具有Columns可以为您提供结果列名称列表的方法。可以用来确定未知查询的列数。

在该Scan方法的文档中,它说:

如果参数的类型为 [] byte,则Scan会将相应数据的副本保存在该参数中。该副本归调用方所有,可以无限期修改和保存。可以通过使用
RawBytes类型的参数来避免复制。有关其使用限制,请参见RawBytes文档。

如果参数的类型为* interface {},则Scan会复制基础驱动程序提供的值,而无需进行转换。如果该值的类型为[]
byte,则进行复制,并且调用方拥有结果。

因此,当我们不知道列值的类型时(原始格式或Go类型),我们也支持扫描列值。

将这两者放在一起,您可以使用...语法调用可变参数函数来执行以下操作:

columnNames, err := rows.Columns()
if err != nil {
    log.Fatalln(err) // or whatever error handling is appropriate
}
columns := make([]interface{}, len(columnNames))
columnPointers := make([]interface{}, len(columnNames))
for i := 0; i < len(columnNames); i++ {
    columnPointers[i] = &columns[i]
}
if err := rows.Scan(columnPointers...); err != nil {
    log.Fatalln(err)
}

现在,columns切片应包含当前结果行的所有列值的解码版本。

如果您对表格有额外的了解(例如,预期的类型,或者提前知道列数),则可以稍微简化一下逻辑。



 类似资料:
  • 问题内容: 我正在将现有脚本中的一列拖入我的模板文件中,并且一切正常。 唯一的问题是,此脚本有一个名为的列,然后每一行在该列中都有一个数字,以显示应在顶部等。例如,如果我将查询设置为“ ”,则一切正常,但是当我使用“ ”,然后出现SQL错误。 我可以没有名为的专栏吗?我不能更改列名,因为它是脚本的一部分。 有办法解决吗? 这是我的SQL查询中的行: 问题答案: 是SQL中的关键字。因此,如果您希望

  • 我正在使用jaydebeapi(Mac OS X)查询Netezza数据库,并执行一些快速/肮脏的计时: 完成大约需要10分钟(平均超过10次)。 现在,当我使用WinSQL(Windows7,ODBC)运行相同的SQL查询时,返回数据大约需要3分钟。我似乎不明白为什么在Python中要花这么长的时间,也不确定如何或从哪里开始寻找。

  • 问题内容: 我在繁忙的数据库上有一个存储过程,该数据库在某种程度上一直在昂贵的查询列表中排在首位。该查询非常简单,它采用单个参数(@ ID,int)作为表的主键,并选择与该ID匹配的记录。主键是带有聚簇索引的身份字段,所以我很困惑如何进一步优化它? 查询如下 不确定发布执行计划的最佳方法-显示的全部内容是聚集索引扫描占用了100%的操作 问题答案: 我认为通过使用您,您将获得次优的计划。将其分为2

  • 问题内容: 我不太擅长SQL,因此我要求你们提供有关编写查询的帮助。 [SQL查询-表连接问题]https://codingdict.com/questions/208252) 我得到了答案,并且可以正常工作!它只是明显的缓慢。我讨厌这样做,但是我真的希望有人在那里推荐一些优化查询的方法。我什至没有自己尝试过,因为我对SQL不够了解,甚至无法开始使用谷歌搜索。 问题答案: 可能有帮助的是在要加入的

  • 问题内容: 在where语句中,添加不必要的括号是否 会影响SQL性能? 例子: 问题答案: 不,没有任何重要意义。 该查询被解析一次,在此阶段,一些额外的括号可能意味着执行时间略有不同,但是您必须要有很多括号才能进行测量。 一旦查询被解析并开始执行,它的行为将与没有多余括号的行为完全相同。仅保留实际操作。