Gorm Go - 使用空的主键片段进行查询
Gorm Go - Query with an empty slice of primary keys
Struct & Map Conditions 的 Gorm 文档提供了以下代码段,用于查询 table 和主键片段
// Slice of primary keys
db.Where([]int64{20, 21, 22}).Find(&users)
// SELECT * FROM users WHERE id IN (20, 21, 22);
但是,如果切片为空,则返回所有记录。查看 Find
函数的 source code 我可以看到只有在 len(conds) > 0
时才添加条件
// Find find records that match given conditions
func (db *DB) Find(dest interface{}, conds ...interface{}) (tx *DB) {
tx = db.getInstance()
if len(conds) > 0 {
if exprs := tx.Statement.BuildCondition(conds[0], conds[1:]...); len(exprs) > 0 {
tx.Statement.AddClause(clause.Where{Exprs: exprs})
}
}
tx.Statement.Dest = dest
return tx.callbacks.Query().Execute(tx)
}
这与我的 SQLite 命令行 returns 相反。如果条件为空则不返回任何记录(因为它们都有主键)
-- no records returned
SELECT * FROM my_table WHERE id IN ();
问题
- 有没有办法使用 Gorm 查询主键切片,如果切片为空,则不返回任何记录?
由于主键从 1
增加,0
id 可用于空查询。
ids := []int64{20, 21, 22}
db.Where(append([]int64{0}, ids...)).Find(&users)
Struct & Map Conditions 的 Gorm 文档提供了以下代码段,用于查询 table 和主键片段
// Slice of primary keys
db.Where([]int64{20, 21, 22}).Find(&users)
// SELECT * FROM users WHERE id IN (20, 21, 22);
但是,如果切片为空,则返回所有记录。查看 Find
函数的 source code 我可以看到只有在 len(conds) > 0
// Find find records that match given conditions
func (db *DB) Find(dest interface{}, conds ...interface{}) (tx *DB) {
tx = db.getInstance()
if len(conds) > 0 {
if exprs := tx.Statement.BuildCondition(conds[0], conds[1:]...); len(exprs) > 0 {
tx.Statement.AddClause(clause.Where{Exprs: exprs})
}
}
tx.Statement.Dest = dest
return tx.callbacks.Query().Execute(tx)
}
这与我的 SQLite 命令行 returns 相反。如果条件为空则不返回任何记录(因为它们都有主键)
-- no records returned
SELECT * FROM my_table WHERE id IN ();
问题
- 有没有办法使用 Gorm 查询主键切片,如果切片为空,则不返回任何记录?
由于主键从 1
增加,0
id 可用于空查询。
ids := []int64{20, 21, 22}
db.Where(append([]int64{0}, ids...)).Find(&users)