gorm.io - 稍后填写预准备语句变量

mrphzbgm  于 2022-12-20  发布在  Go
关注(0)|答案(1)|浏览(78)

假设我有一些沿着于

db.Where("id = ? AND name = ?", 20, "Zack"}.First(&user)

有没有一种方法可以将它分解,使它更像这样(这是伪代码)?

db.Where("id = ? AND name = ?")
db.PrepareNextStatement(20).PrepareNextStatement("Zack").First(&user)

基本上,我正在处理一个条件数量可变的查询,因此在某些情况下,我希望按id进行过滤,有时按name进行过滤,有时候两者都有。如果我想让它更灵活(比如说添加一个type过滤器)如果有一些代码,我可以将其作为一个条件进行附加,那就太好了(有一些函数生成"id = ? AND ..."字符串,还有一些函数运行可变数量的PrepareNextStatement调用)。
我试过构建字符串并调用Raw,显然这是可行的,但容易出现安全问题。需要使用预准备语句。

nfs0ujit

nfs0ujit1#

您可以将structslicemap传递给db.Where请查看https://gorm.io/docs/query.html#Struct-amp-Map-Conditions

// Struct
db.Where(&User{Name: "jinzhu", Age: 20}).First(&user)
// SELECT * FROM users WHERE name = "jinzhu" AND age = 20 ORDER BY id LIMIT 1;

// Map
db.Where(map[string]interface{}{"name": "jinzhu", "age": 20}).Find(&users)
// SELECT * FROM users WHERE name = "jinzhu" AND age = 20;

// Slice of primary keys
db.Where([]int64{20, 21, 22}).Find(&users)
// SELECT * FROM users WHERE id IN (20, 21, 22);

或者利用https://gorm.io/docs/method_chaining.html

相关问题