你如何使用golang sql在postgres中选择整个表?

时间:2017-09-06 21:10:32

标签: postgresql go

我对posgres和Go很新,但在这方面已经挣扎了一段时间。我目前正在尝试发送查询以从表中检索所有内容。 当我尝试使用

def calcPerPartition(itr: Iterator[(InputKey, InputVal)]):
  Iterator[Option[(ReportKey, ReportVal)]] = {

    val workMap = mutable.HashMap.empty[WorkKey, WorkVal]
    var finalWorkMap = true

    new Iterator[Option[(ReportKey, ReportVal)]](){
        override def hasNext: Boolean = itr.hasNext

        override def next(): Option[(ReportKey, ReportVal)] = {
            val curr = itr.next()
            val iKey = curr._1
            val iVal = curr._2
            val eventKey = EventKey(openKey.date, openKey.symbol)

            if (iKey.recordType == reportType) {
              Some(getNewReportRecord(workMap, iKey, iVal))
            }
            else {
              //otherwise update the generic interest map but don't accumulate anything
              updateWorkMap(workMap, iKey, iVal)
              if (itr.hasNext) {
                next()
              }
              else {
                  if(finalWorkMap){
                    finalWorkMap = false //because we want a final only once
                    Some(workMap.map(convertToReport))
                  }
                  else {
                    None
                  }

              }
            }
        }
    }
  }
在postgres中,它显示了所有内容,但是当我使用Query执行相同操作时,我得到了。

SELECT * FROM land_registry_price_paid_uk

这是我当前的代码。

sql: expected 16  destination arguments in Scan, not 1

感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

看起来您的查询工作正常,您返回16列数据并尝试将它们全部扫描到单个字符串变量中,您需要为每列提供持有者变量:

var name string
// vars to hold other column values go here

// then reference vars in table order as args to row.Scan below
if err := rows.Scan(&name); err != nil {
    log.Fatal(err)
}

如果您还没有使用过sql / go,那么您可能还想查看为处理可空值而提供的特殊类型,因为您可能也需要这些:

NullString example

<强>更新

为了进一步说明,假设您有一个三列表,其中包含以下字段:

  • id(int)
  • name(string)
  • optional_data(string,nullable)

您可以按如下方式阅读该行(未测试):

var (
    id int 
    name string
    optionalData sql.NullString
)

if err := rows.Scan(&id, &name, &optionalData); err != nil {
    log.Fatal(err)
}

答案 1 :(得分:0)

非常感谢,这对我很有用。但我想补充一点信息。 好吧,我不知道你的goalng版本是什么,但是我在windows / 386上使用的是1.11.2版本,但是当我添加括号时,这是行不通的。但是没有它们,它运行得很好。

使用此:             行,错误:= a.DB.Query(“ SELECT * FROM mytable”) 代替 :             行,错误:= a.DB.Query(“ SELECT(*)FROM mytable”)

这是我的示例:

rows, err := db.Query("SELECT * FROM words")
    if err != nil {
        log.Fatal(err)
    }
    defer rows.Close()
    println(rows)
    for rows.Next() {
        var word, exa1, exa2, mean string
        var id int
        if err := rows.Scan(&id, &word, &exa1, &exa2, &mean); err != nil {
            log.Fatal(err)
        }
        fmt.Printf("id: %d\n word: %s \n example1: %s \n example2: %s \n meaning: %s\n---\n\n", id, word, exa1, exa2, mean)
    } 

  I hope this will be useful.