Могу ли я использовать прямой SQL для получения количества строк в таблице с помощью Fluent (Vapor)?

Я хочу сделать это SELECT COUNT(column_name) FROM table_name;, чтобы вернуть Int и вернуть его как часть ответа. Я не хочу загружать каждый объект в память только для подсчета; вот так: User.query().all().count

Пожалуйста, скажите мне, что это возможно с Fluent! :)


person SirRupertIII    schedule 27.11.2016    source источник


Ответы (1)


Это возможно с raw методом. Вот пример для MySQL

guard let mysql = drop.database?.driver as? MySQLDriver else {
    return
}

let count = try mysql.raw("SELECT COUNT(column_name) FROM table_name")

Также каждый драйвер должен реализовать raw метод

public protocol Driver {
    var idKey: String { get }
    func query<T: Entity>(_ query: Query<T>) throws -> Node
    func schema(_ schema: Schema) throws
    func raw(_ raw: String, _ values: [Node]) throws -> Node
}
person Quver    schedule 27.11.2016
comment
Вау, это потрясающе! Спасибо! Я посмотрю поближе, но могу ли я просто привести к желаемому типу? Или он вернет какой-то тип SQLResult? Или что-то другое? - person SirRupertIII; 27.11.2016
comment
Вы получите тот же результат, что и в методе query (), этот внутренний тип Node. - person Quver; 28.11.2016
comment
Также, если мой ответ поможет, отметьте вопрос как решенный. - person Quver; 28.11.2016