gpt4 book ai didi

postgresql - 如何使用 lib/pq 将 hstore 对象插入到 postgres

转载 作者:IT王子 更新时间:2023-10-29 01:40:35 25 4
gpt4 key购买 nike

对于这张表,

# \d table
Table "public.table"
Column | Type | Collation | Nullable | Default
------------+-----------------------------+-----------+----------+--------------------
id | uuid | | not null | uuid_generate_v4()
my_field | hstore | | |
Indexes:
"table_pkey" PRIMARY KEY, btree (id)

如何使用 lib/pq 更新 my_field ?我试着跟随,

package "main"

import (
"os"
"database/sql"
_ "github.com/lib/pq"
)

func main() {
postgresConn, _ := sql.Open("postgres", os.Getenv("DB_CONN_URL"))
id := "024b54f2-a477-4715-984c-896bf0446dcf"
data := map[string]string{"data": "data"}
postgresConn.QueryRow("UPDATE table SET my_field = $1 WHERE id = $2", data, id)
}

我不确定可以使用哪种其他类型。

最佳答案

lib/pq支持 hstore,如其所述 mkopriva可以查资料here .但它可能需要一些说明或更好的示例。

首先,此驱动程序中的Hstore 是一个包含映射的结构:

type Hstore struct {
Map map[string]sql.NullString
}

所以,如果你想使用那个 map ,你首先需要初始化它:

h := hstore.Hstore{}
h.Map = make(map[string]sql.NullString)

然后,您就可以使用它了,但是考虑到映射的格式为 [string]sql.NullString,您需要将值字段转换为 sql.NullString(可为空的字符串,golang 中的默认字符串不可为空。)为此,您可以编写一个函数来完成该工作:

//ToNullString invalidates a sql.NullString if empty, validates if not empty
func ToNullString(s string) sql.NullString {
return sql.NullString{String: s, Valid: s != ""}
}

现在,你可以这样做:

data := hstore.Hstore{}
data.Map["data"] = ToNullString("data")

_, err = db.Exec(`INSERT INTO table(id, my_field) VALUES ($1, $2)`, data, id)

然后你可以更新你的 hstore 的值执行这个:

data.Map["data"] = ToNullString("dat")
_, err := postgresConn.Exec(`UPDATE table SET my_field = my_field || $1 WHERE id = $2`, data, id)

注意使用update会更新Hstore中的map,也就是说如果你只是改变value部分,它会更新value;但是如果您更改键和值,它会在您的 hstore 中添加一对新的 (key, value) 而不是替换旧的。

为了澄清一点,我放了一个示例代码来测试它是如何工作的,这段代码应该与你的参数一起工作,我只是将 table 更改为 tabl 为了尊重 postgreSQL 关键字:

package main

import (
"database/sql"
"fmt"

_ "github.com/lib/pq"
"github.com/lib/pq/hstore"
)

//ToNullString invalidates a sql.NullString if empty, validates if not empty
func ToNullString(s string) sql.NullString {
return sql.NullString{String: s, Valid: s != ""}
}

func main() {
var err error //To handle different errors
postgresConn, _ := sql.Open("postgres", os.Getenv("DB_CONN_URL"))

data := hstore.Hstore{}
data.Map = make(map[string]sql.NullString)


//Inserting the first element with:
//id: "024b54f2-a477-4715-984c-896bf0446dcf"
//my_field :"data => data"
id := "024b54f2-a477-4715-984c-896bf0446dcf"
data.Map["data"] = ToNullString("data")
_, err = postgresConn.Exec(`INSERT INTO tabl(id, my_field) VALUES ($2, $1)`, data, id)
if err != nil {
fmt.Println(err)
}

//Adding a second field in hstore:
//id: "024b54f2-a477-4715-984c-896bf0446dcf"
//my_field :"data => data", "data2 => more_data"
data.Map["data2"] = ToNullString("more_data")
_, err = postgresConn.Exec(`UPDATE tabl SET my_field = my_field || $1 WHERE id = $2`, data, id)
if err != nil {
fmt.Println(err)
}

//Modifying the first value field:
//id: "024b54f2-a477-4715-984c-896bf0446dcf"
//my_field :"data => value, data2 => more_data"
data.Map["data"] = ToNullString("value")
_, err = postgresConn.Exec(`UPDATE tabl SET my_field = my_field || $1 WHERE id = $2`, data, id)
if err != nil {
fmt.Println(err)
}
}

要从 sql 的角度获取更多信息以使用 hstore,您可以查看 here .

PD:不要使用 table 作为表名,因为它是 reserved word .

PD2:我仅将 postgresConn.Exec() 函数用于演示,如果您需要准备好的语句,请更改它,有关何时使用 Exec() 或 Query() 的更多信息 here .

PD3:使用map时,key和value尽量不要使用相同的值。

关于postgresql - 如何使用 lib/pq 将 hstore 对象插入到 postgres,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54998054/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com