Vapor3初探——使用Fluent查詢數(shù)據(jù)

Vapor升級到Vapor3的時間恰巧趕上WWDC砾层,本來想從美國回來就開始寫一些關(guān)于Vapor3的文章托慨,但是WWDC信息量太大了左胞,直到現(xiàn)在才轉(zhuǎn)過來寫一點關(guān)于Vapor的東西瑰抵。

這篇文章主要介紹如何使用Fluent查詢數(shù)據(jù)你雌,后面我會補(bǔ)上如何配置相關(guān)的教程。

Fluent為我們提供了一個Model類二汛, MySQLModel婿崭、 PostgreSQLModel、SQLiteModel均繼承自這個類肴颊。在Model的一個extension中氓栈,F(xiàn)lunt為我們提供了一個query方法并返回 QueryBuilder<Self.Database, Self>

下面,我們再看看這個QueryBuilder:

QueryBuilder<Self.Database, Self>

這個QueryBuilder會含有Model的類型婿着,數(shù)據(jù)庫類型授瘦,利用這些信息來連接數(shù)據(jù)庫進(jìn)行查詢幸海。

現(xiàn)在有了這個QueryBuilder了,下面就可以利用它來進(jìn)行查詢操作了:

為了簡化對問題的理解奥务,這里提供一個最簡單的Model來驗證:

import FluentMySQL
import Vapor

/// A single entry of a Todo list.
final class Todo: Codable {
    /// The unique identifier for this `Todo`.
    var id: Int?

    /// A title describing what this `Todo` entails.
    var title: String

    /// Creates a new `Todo`.
    init(id: Int? = nil, title: String) {
        self.id = id
        self.title = title
    }
}


extension Todo: MySQLModel { }

/// Allows `Todo` to be used as a dynamic migration.
extension Todo: Migration { }

/// Allows `Todo` to be encoded to and decoded from HTTP messages.
extension Todo: Content { }

/// Allows `Todo` to be used as a dynamic parameter in route definitions.
extension Todo: Parameter { }

可以看到這里的Todo類只含有一個id和title物独,而id由mysql數(shù)據(jù)庫自動生成,只需要傳入一個title則可以添加一條記錄氯葬。

查詢所有記錄

Todo.query(on: req).all()

查詢title為'work'的記錄

try Todo.query(on: req).filter(\.title == "work" ).all()

查詢title不為'work'的記錄

try Todo.query(on: req).filter(\.title != "work" ).all()

查詢id大于5的記錄

try Todo.query(on: req).filter(\.id > 5 ).all()

查詢id小于5的記錄

try Todo.query(on: req).filter(\.id < 5 ).all()

查詢id大于等于5的記錄

try Todo.query(on: req).filter(\.id >= 5 ).all()

查詢id小于等于5的記錄

try Todo.query(on: req).filter(\.id <= 5 ).all()

查詢id為 5挡篓、7、11的數(shù)據(jù)

try Todo.query(on: req).filter(\.id ~~ [5, 7, 11]).all()

查詢id不為 5帚称、7官研、11的數(shù)據(jù)

try Todo.query(on: req).filter(\.id !~ [5, 7, 11]).all()

模糊查詢

查詢title前綴為‘work’的數(shù)據(jù)

Todo.query(on: req).filter(\.title, .like, "work%").all()

查詢title后綴為‘work’的數(shù)據(jù)

Todo.query(on: req).filter(\.title, .like, "%work").all()

查詢title包含‘work’的數(shù)據(jù)

Todo.query(on: req).filter(\.title, .like, "%work%").all()

如果只查詢一條數(shù)據(jù)

Todo.query(on: req).filter(\.title, .like, "%work%").first()

如果什么都查不出來,則會返回nil

其實模糊查詢也有提供類似于 ==, !=, >, <這樣的操作符闯睹,但是經(jīng)過測試并沒有達(dá)到比較好的效果戏羽,所以這里的demo只是展示目前我測試可用的方法,如果未來能夠支持的更好楼吃,我會再補(bǔ)充始花。

更多查詢方法:

《SQL》庫中的GenericSQLBinaryOperator包含sql中需要的操作符,這里貼出部分源碼一看究竟:

/// See `SQLSerializable`.
    public func serialize(_ binds: inout [Encodable]) -> String {
        switch self {
        case ._add: return "+"
        case ._bitwiseAnd: return "&"
        case ._bitwiseOr: return "|"
        case ._bitwiseShiftLeft: return "<<"
        case ._bitwiseShiftRight: return ">>"
        case ._concatenate: return "||"
        case ._divide: return "/"
        case ._equal: return "="
        case ._greaterThan: return ">"
        case ._greaterThanOrEqual: return ">="
        case ._lessThan: return "<"
        case ._lessThanOrEqual: return "<="
        case ._modulo: return "%"
        case ._multiply: return "*"
        case ._notEqual: return "!="
        case ._subtract: return "-"
        case ._and: return "AND"
        case ._or: return "OR"
        case ._in: return "IN"
        case ._notIn: return "NOT IN"
        case ._is: return "IS"
        case ._isNot: return "IS NOT"
        case ._like: return "LIKE"
        case ._glob: return "GLOB"
        case ._match: return "MATCH"
        case ._regexp: return "REGEXP"
        case ._notLike: return "NOT LIKE"
        case ._notGlob: return "NOT GLOB"
        case ._notMatch: return "NOT MATCH"
        case ._notRegexp: return "NOT REGEXP"
        }
    }

我們可以在filter中選擇適用的操作符孩锡。

Order

查詢結(jié)果可以給一個order進(jìn)行升序和降序排序

Todo.query(on: req).sort(\.id, .ascending).all()
Todo.query(on: req).sort(\.id, .descending).all()

Union?

目前vapor3配套的Flunt3還沒有union功能酷宵,并且官方文檔和源代碼中并未找到union相關(guān)的方法,相信不久就會添加相關(guān)的特性躬窜,還是耐心等待浇垦,如果一旦添加了這樣的方法,我會第一時間更新荣挨。

總結(jié)

vapor3的查詢還是和vapor2有著比較大的差異的男韧,之前vapor2的一個Model一統(tǒng)江湖的特點在vapor3上也沒有得到體現(xiàn),目前各個子模塊也都還在開發(fā)中默垄,希望會越來越好用吧此虑。

我的博客即將搬運(yùn)同步至騰訊云+社區(qū),邀請大家一同入駐:https://cloud.tencent.com/developer/support-plan?invite_code=1nhel12vro8mw

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末厕倍,一起剝皮案震驚了整個濱河市寡壮,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌讹弯,老刑警劉巖况既,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異组民,居然都是意外死亡棒仍,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進(jìn)店門臭胜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來莫其,“玉大人癞尚,你說我怎么就攤上這事÷叶福” “怎么了浇揩?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長憨颠。 經(jīng)常有香客問我胳徽,道長,這世上最難降的妖魔是什么爽彤? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任养盗,我火速辦了婚禮,結(jié)果婚禮上适篙,老公的妹妹穿的比我還像新娘往核。我一直安慰自己,他們只是感情好嚷节,可當(dāng)我...
    茶點故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布聂儒。 她就那樣靜靜地躺著,像睡著了一般丹喻。 火紅的嫁衣襯著肌膚如雪薄货。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天碍论,我揣著相機(jī)與錄音,去河邊找鬼柄慰。 笑死鳍悠,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的坐搔。 我是一名探鬼主播藏研,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼概行!你這毒婦竟也來了蠢挡?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤凳忙,失蹤者是張志新(化名)和其女友劉穎业踏,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體涧卵,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡勤家,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了柳恐。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片伐脖。...
    茶點故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡热幔,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出讼庇,到底是詐尸還是另有隱情绎巨,我是刑警寧澤,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布蠕啄,位于F島的核電站认烁,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏介汹。R本人自食惡果不足惜却嗡,卻給世界環(huán)境...
    茶點故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望嘹承。 院中可真熱鬧窗价,春花似錦、人聲如沸叹卷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽骤竹。三九已至帝牡,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蒙揣,已是汗流浹背靶溜。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留懒震,地道東北人罩息。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像个扰,于是被迫代替她去往敵國和親瓷炮。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,446評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 關(guān)于Mongodb的全面總結(jié) MongoDB的內(nèi)部構(gòu)造《MongoDB The Definitive Guide》...
    中v中閱讀 31,905評論 2 89
  • 1递宅、通過CocoaPods安裝項目名稱項目信息 AFNetworking網(wǎng)絡(luò)請求組件 FMDB本地數(shù)據(jù)庫組件 SD...
    陽明先生_X自主閱讀 15,969評論 3 119
  • 落花聽雨閱讀 351評論 13 7
  • 在重男輕女的年代娘香,我是被放養(yǎng)的模式長大的,每個人都很忙办龄,忙到除了給我吃穿烘绽,別的都顧不上了。 我每天一萬個為什么無人...
    孤詣的花田半畝閱讀 237評論 1 3
  • 來到鄒容烈士紀(jì)念碑土榴,四周是靜悄悄的诀姚。這份靜與鄒容烈士短暫卻熾熱的一生形成鮮明的對比。 “革命玷禽!革命赫段!得之則生呀打,不得...
    simkey閱讀 495評論 0 2