# #go-gorm
Вопрос:
Документация Gorm по условиям структуры и карты содержит следующий фрагмент для запроса таблицы с фрагментом первичных ключей
// Slice of primary keys
db.Where([]int64{20, 21, 22}).Find(amp;users)
// SELECT * FROM users WHERE id IN (20, 21, 22);
Однако, если срез пуст, то возвращаются все записи. Глядя на исходный код Find
функции, я вижу, что условия добавляются только в том случае, если 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. Если условие пустое, то записи не возвращаются (поскольку все они имеют первичный ключ).
-- no records returned
SELECT * FROM my_table WHERE id IN ();
Вопрос
- Есть ли способ запросить фрагмент первичных ключей с помощью Gorm таким образом, чтобы, если фрагмент пуст, записи не возвращались?
Ответ №1:
Поскольку первичные ключи увеличиваются с 1
, 0
идентификатор может быть использован в пустом запросе.
ids := []int64{20, 21, 22}
db.Where(append([]int64{0}, ids...)).Find(amp;users)
Комментарии:
1. Спасибо. Я принимаю это, но это кажется очень неинтуитивным, поэтому я поднял запрос на функцию go-gorm: github.com/go-gorm/gorm/issues/4857