Gorm Go — Запрос с пустым фрагментом первичных ключей

# #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