使用Go语言操作PostgreSQL

由于有机会在golang中操作postgres而没有使用ORM,我学到了很多东西,所以想整理一下并分享。

使用图书馆

github.com/lib/pq 数据库 / sql

排列

在PostgreSQL中,存在数组类型,可以灵活地操作多个值。
通过聚合函数,可以将匹配的值转换为数组并使用DISTINCT获取唯一值的数组(速度不保证)。

如果使用 golang 进行编写的话,以下是相应的方式。

targetIds = []int{400,500}
// queryに配列を埋め込む
db.Query(`SELECT * FROM t WHERE id = ANY($1)`, pq.Array(targetIds))

// query結果を配列に変換する
var x []sql.NullInt64
db.QueryRow(`SELECT ARRAY[235, 401]`).Scan(pq.Array(&x))

在Golang中,可以使用pg.Array函数轻松地将数组与查询进行操作。

json -> json (不需要翻译)

对比MySQL,PostgreSQL具有JSON类型,可以轻松地对数据进行格式化。可以将JSON转换为列等,将其转换为易于处理的形式。
本次仅简单地从JSON类型提取数据。

// 書き込み
insertQuery := "INSERT into t jsonColumn (jsonData) values($1)"
d, _ := json.Marshal(newData)
db.Exec(insertQuery, d)

// 読み込み
selectQuery := "SELECT jsonColumn FROM t"
row, _ := db.QueryRow(selectQuery)
var jsonRaw null.String
row.scan(row, &jsonRaw)

var resultStruct <適当な構造体>

json.Unmarshal([]byte(jsonRaw), &resultStruct)

只需要简单地将其转换为 JSON 并嵌入即可。
让我们使用 JSON 包。

回应 PK

如果在插入时有主键,PostgreSQL会立即返回它。
在Golang中,如下所示。

var targetId int
insertMasterQuery := "INSERT INTO t (id) VALUES (DEFAULT) RETURNING id;"
err := database.QueryRow(insertMasterQuery, newsId).Scan(&targetId)

最后

在实际使用中,可能需要将其与ORM等组合使用。Postgres具有多功能和灵活的处理能力,但记忆的内容也很多。
但是,只要掌握基本知识,我认为就不会遇到太多困惑。

广告
将在 10 秒后关闭
bannerAds