我想知道是否可以将参数传递给用 PL/pgSQL 编写的查询?
我试过这个,但它失败了pq: got 1 parameters but the statement requires 0
package main
import (
"database/sql"
"fmt"
"log"
_ "github.com/lib/pq"
)
func main() {
db, err := sql.Open("postgres", "host=localhost dbname=db user=user sslmode=disable password=pw")
if err != nil {
log.Fatal(err)
}
row := db.QueryRow(`
DO $$
BEGIN
IF true THEN
SELECT $1;
END IF;
END$$
`, 1)
var num int
err = row.Scan(&num)
if err != nil {
log.Fatal(err)
}
fmt.Println(num)
}
另一个相关的问题是我想使用事务,但是sql
包提供的 API 似乎每次在 tx 中执行查询时都会连接到 db。如果可能的话,我希望所有事情都能一口气完成。例如,使用 go 你应该使用这样的事务
tx, err := db.Begin()
rows, err := tx.Query(sql1)
result, err := tx.Exec(sql2)
tx.Commit()
问题是,如果我没记错的话,调用tx.Query
并两次访问 PostgreSQL 服务器。tx.Exec
我想要实现的是合并sql1
and sql2
,将它们包装在里面BEGIN
并END
一次执行它们。我的问题是:
- 你觉得有必要吗?我想如果有足够的流量,性能差异可能会很明显,但我不确定。
- 如果是这样,执行此合并交易的最佳方式是什么?创建一个函数并在 PL/pgSQL 中运行事务(因为我可能需要使用条件语句等)?