假设我有一个表“testing”,其中有一列“agents”,类型为
jsonb
,用于存储代理名称数组
> SELECT * FROM testing;
+--------------------------------------+---------------------+
| id | agents |
|--------------------------------------+---------------------|
| 018d17a4-5418-1f87-f702-3ed8325f4d11 | ["mikel", "arsene"] |
+--------------------------------------+---------------------+
我可以使用
?
运算符来查找将字符串作为代理之一的记录。
> SELECT * FROM testing WHERE agents ? 'mikel'
+--------------------------------------+---------------------+
| id | agents |
|--------------------------------------+---------------------|
| 018d17a4-5418-1f87-f702-3ed8325f4d11 | ["mikel", "arsene"] |
+--------------------------------------+---------------------+
但是,在 gorm 中,
?
也充当占位符。所以我无法将查询形成为
query := `SELECT * FROM testing WHERE agents ? ?
gorm.Raw(query, 'mikel')
将生成原始查询
SELECT * FROM testing WHERE agents 'mikel' ?
我知道我可以使用
@>
运算符来实现此目的,但我想知道如何具体使用 ?
运算符
GORM 有相应的软件包:https://github.com/go-gorm/datatypes#json
正如文档所述,您的代码应该如下所示:
import "gorm.io/datatypes"
err := db.Raw(
`SELECT * FROM testing WHERE ? AND foo = 'bar'`,
datatypes.JSONQuery("agents").HasKey("mikel"),
).
Scan(...).
Error
这给出了查询:
SELECT * FROM testing WHERE "agents"::jsonb ? 'mikel' AND foo = 'bar'