Golang中Postgresql参数占位符的使用

Golang中Postgresql参数占位符的使用 这个查询在Go环境外能正常工作:

SELECT job_id,job_subjectFROM job
WHERE lower(concat(job_id,job_subject)) like lower('%WEB%')

我尝试在这个查询中用占位符替换“WEB”。

SELECT job_id,concat(co_name1||co_name2) as co_name,job_subject FROM job
WHERE lower(concat(job_id,job_subject)) like lower('%$?%')

在Go中我这样使用:

rows, err := db.Queryx(query, val)

但我遇到了这个错误:

pq: got 1 parameters but the statement requires 0

我哪里做错了?


更多关于Golang中Postgresql参数占位符的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

2 回复

解决方案是将字符串拼接起来:

lower('%'||$1||'%')

更多关于Golang中Postgresql参数占位符的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在Go中使用PostgreSQL参数占位符时,问题在于你使用了错误的占位符语法。PostgreSQL使用$1$2这样的数字占位符,而不是$?

以下是正确的写法:

// 正确的查询语句
query := `
SELECT job_id, concat(co_name1||co_name2) as co_name, job_subject 
FROM job 
WHERE lower(concat(job_id, job_subject)) like lower('%' || $1 || '%')
`

// 或者使用concat函数
query := `
SELECT job_id, concat(co_name1||co_name2) as co_name, job_subject 
FROM job 
WHERE lower(concat(job_id, job_subject)) like lower(concat('%', $1, '%'))
`

val := "WEB"
rows, err := db.Queryx(query, val)

如果你需要多个参数,使用$1$2等:

query := `
SELECT job_id, job_subject 
FROM job 
WHERE job_id = $1 AND lower(job_subject) like lower('%' || $2 || '%')
`

rows, err := db.Queryx(query, 123, "WEB")

对于Queryx方法(来自sqlx包),用法相同:

import "github.com/jmoiron/sqlx"

// 假设db是*sqlx.DB
query := `
SELECT job_id, concat(co_name1||co_name2) as co_name, job_subject 
FROM job 
WHERE lower(concat(job_id, job_subject)) like lower('%' || $1 || '%')
`

val := "WEB"
rows, err := db.Queryx(query, val)

如果你使用的是database/sql的标准库:

query := `
SELECT job_id, concat(co_name1||co_name2) as co_name, job_subject 
FROM job 
WHERE lower(concat(job_id, job_subject)) like lower('%' || $1 || '%')
`

val := "WEB"
rows, err := db.Query(query, val)

错误pq: got 1 parameters but the statement requires 0的出现是因为PostgreSQL驱动没有在查询语句中找到任何有效的参数占位符($1$2等),但你却传递了一个参数值。

回到顶部