Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 使用数组值更新表中的记录_Postgresql_Go - Fatal编程技术网

Postgresql 使用数组值更新表中的记录

Postgresql 使用数组值更新表中的记录,postgresql,go,Postgresql,Go,我试图用一个数组(片)值更新postgres表中的记录。该表具有以下DDL: CREATE TABLE slm_files ( id uuid DEFAULT gen_random_uuid() PRIMARY KEY, filename character varying NOT NULL, status character varying NOT NULL, original_headers text[] ); 我的Go代码如下: package main

我试图用一个数组(片)值更新postgres表中的记录。该表具有以下DDL:

CREATE TABLE slm_files (
    id uuid DEFAULT gen_random_uuid() PRIMARY KEY,
    filename character varying NOT NULL,
    status character varying NOT NULL,
    original_headers text[]
);
我的Go代码如下:

package main

import (
    "context"
    "database/sql"
    "encoding/json"
    "fmt"
    "os"
    "strings"
    "time"

    "github.com/aws/aws-lambda-go/events"
    "github.com/aws/aws-lambda-go/lambda"
    "github.com/lib/pq"
)

type message struct {
    ID              string   `json:"id"`
    Filename        string   `json:"filename"`
    Status          string   `json:"status"`
    OriginalHeaders []string `json:"OriginalHeaders"`
}

func main() {
    host := os.Getenv("PGhost")
    port := 5432
    user := os.Getenv("PGuser")
    password := os.Getenv("PGpassword")
    dbname := os.Getenv("PGdbname")

    pgConString := fmt.Sprintf("port=%d host=%s user=%s "+
        "password=%s dbname=%s sslmode=disable",
        port, host, user, password, dbname)

    msgBody := `update_headers___
  {
      "id": "76b67119-d8c1-4a20-b53e-49e4972e2f19",
      "filename": "SLM1171_inputData_preNCOA-5babc88b-1d14-468d-bf6e-c3b36ce90d95.csv",
      "status": "Submitted",
      "OriginalHeaders": [
          "city",
          "state",
          "zipcode",
          "full_name",
          "individual_id"
      ]
  }`
    fmt.Println("Processing file", msgBody)
    queryMethod := strings.Split(msgBody, "___")[0]
    fieldDict := strings.Split(msgBody, "___")[1]

    db, err := sql.Open("postgres", pgConString)
    if err != nil {
        panic(err)
    }
    fmt.Println("Connected Successfully")
    defer db.Close()

    body := message{}
    json.Unmarshal([]byte(fieldDict), &body)
    fmt.Println(queryMethod)
    fmt.Println(body)

    var sqlStatement string
    switch queryMethod {
    case "update_ncoa":
        sqlStatement = fmt.Sprintf(`UPDATE slm_files SET status = '%s', updated_at = '%s' where id = '%s';`,
            body.Status,
            body.UpdatedAt,
            body.ID,
        )
    case "update_headers":
        sqlStatement = fmt.Sprintf(`UPDATE slm_files SET original_headers = '%s', updated_at = '%s' where id = '%s';`,
            pq.Array(body.OriginalHeaders),
            body.UpdatedAt,
            body.ID,
        )
    }
    fmt.Println(sqlStatement)
    _, err = db.Query(sqlStatement)
    if err != nil {
        fmt.Println("Failed to run query", err)
        return
    }
}
    fmt.Println("Query executed!")
    return
}
但我一直在犯错误

pq: malformed array literal: "&[first_name last_name city state zipcode full_name individual_id]": Error
null
我在互联网上读到一些东西,这些东西引导我使用
pq.Array()
,但这似乎不起作用


我已经读到了Go数组和Postgres数组在格式上的差异,所以我希望让pq.Array函数来解决问题,但显然不是这样。

正如Peter建议的那样,数据库处理有很多问题需要解决。而且绝对值得重做这些SQL语句,以避免使用Sprintf进行查询

但是,在使用postgres数组和pq库时,需要使用pq.Array的Value()方法来获取postgres格式。将标题的update语句更改为以下内容:

arrayVal, _ := pq.Array(body.OriginalHeaders).Value()
sqlStatement = fmt.Sprintf(`UPDATE slm_files SET original_headers = '%s', updated_at = '%s' where id = '%s';`,
        arrayVal,
        body.UpdatedAt,
        body.ID,
    )

值得检查Value()方法的返回以确保没有错误,我只是为了一个简单的示例而忽略了它。

不要使用Sprintf构造SQL查询,至少不要对动态值进行查询。这为SQL注入打开了大门。使用占位符和变量参数来执行,如中所示。谢谢,我知道这不是最佳实践,但这是不是我的遗留代码,我只需要做一件事。这不仅是最佳实践,也是关于正确性的。Sprintf无法生成有效的SQL语法,因此无法工作。你必须重写代码。