在 Go 中的 Postgres 中,如何使查询参数可选?
本例中status是一个可选条件。如果没有status传递,则将获取表记录中的所有行。
如何使查询参数成为&d.Status可选参数
type QueryParams struct {
Status string `json:"status"`
}
func (r repo) GetRecords(d *QueryParams) ([]*Records, error) {
statusQuery := ""
if d.Status != "" {
statusQuery = " where status = $1 "
}
query := "select id, title, status from records " + statusQuery
rows, err := r.db.Query(query, &d.Status)
}
Run Code Online (Sandbox Code Playgroud)
Query是可变参数,因此您可以构建一个[]interface{}来保存参数:
args := []interface{}{}
Run Code Online (Sandbox Code Playgroud)
然后有条件地构建参数列表:
if d.Status != "" {
statusQuery = " where status = $1 "
args = append(args, &d.Status)
}
Run Code Online (Sandbox Code Playgroud)
运行查询时,请使用以下命令展开参数...:
rows, err := r.db.Query(query, args...)
Run Code Online (Sandbox Code Playgroud)
您可以使用灵活的WHERE子句,例如
SELECT id, title, status
FROM records
WHERE status = $1 OR $1 IS NULL;
Run Code Online (Sandbox Code Playgroud)
这里的逻辑是,如果您为 提供一个值$1,它必须与状态匹配才能返回记录。否则,如果$1被省略(即是NULL),则将返回所有记录。
请注意,要使用 Postgres 驱动程序在 Go 中完成此操作,您可能需要进行一些额外的操作。第一次尝试时,我会尝试这样做:
statusQuery = "where status = $1 or $1::text is null"
query := "select id, title, status from records " + statusQuery
rows, err := r.db.Query(query, &d.Status)
Run Code Online (Sandbox Code Playgroud)
有时驱动程序无法确定绑定参数的类型$1。通过将其显式转换为text,可以使该语句起作用。
| 归档时间: |
|
| 查看次数: |
2377 次 |
| 最近记录: |