成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

寫一個(gè)“特殊”的查詢構(gòu)造器 - (前言)

GitChat / 2543人閱讀

摘要:而在項(xiàng)目開發(fā)中,我們想要的是一個(gè)更好用的可維護(hù)的工具,此時(shí),對(duì)代碼的封裝模塊化就顯得尤為重要,于是出現(xiàn)了兩種方案查詢構(gòu)造器,對(duì)象關(guān)系映射。典型環(huán)境下按照一般的查詢構(gòu)造器處理就行。

文章目錄

寫一個(gè)“特殊”的查詢構(gòu)造器 - (前言)

寫一個(gè)“特殊”的查詢構(gòu)造器 - (一、程序結(jié)構(gòu),基礎(chǔ)封裝)

寫一個(gè)“特殊”的查詢構(gòu)造器 - (二、第一條語句)

寫一個(gè)“特殊”的查詢構(gòu)造器 - (三、條件查詢)

寫一個(gè)“特殊”的查詢構(gòu)造器 - (四、條件查詢:復(fù)雜條件)

寫一個(gè)“特殊”的查詢構(gòu)造器 - (五、聚合函數(shù)、分組、排序、分頁)

寫一個(gè)“特殊”的查詢構(gòu)造器 - (六、關(guān)聯(lián))

寫一個(gè)“特殊”的查詢構(gòu)造器 - (七、DML 語句、事務(wù))

寫一個(gè)“特殊”的查詢構(gòu)造器 - (八、單元測(cè)試、收尾工作)

更新

此項(xiàng)目已經(jīng)從 WorkerA 中拆分為獨(dú)立項(xiàng)目,完整代碼請(qǐng)到 wazsmwazsm/DB 中查看。

前言

對(duì)于后端程序員來說,數(shù)據(jù)庫操作是必備知識(shí),對(duì)數(shù)據(jù)的增刪查改也是業(yè)務(wù)中最普遍、頻繁的操作。

對(duì)于關(guān)系型數(shù)據(jù)庫,如 Mysql、Postgresql 等,我們可以使用 SQL (Structured Query Language) 來操作我們的數(shù)據(jù),如 “SELECT * FROM test;” 這類的 SQL 語句,大部分的編程語言如 PHP、Python、go 等都提供了相應(yīng)的數(shù)據(jù)庫擴(kuò)展,可以方便的進(jìn)行數(shù)據(jù)庫連接、執(zhí)行 SQL 獲取結(jié)果。

但是,直接使用基礎(chǔ)的擴(kuò)展效率并不高,每次都要?jiǎng)?chuàng)建連接、手動(dòng)寫 SQL、對(duì)執(zhí)行結(jié)果進(jìn)行判斷、將查詢得到的數(shù)據(jù)進(jìn)行處理等,代碼的重用性和維護(hù)性并不是很好,在多人開發(fā)的時(shí)候更是不能保證代碼質(zhì)量。而在項(xiàng)目開發(fā)中,我們想要的是一個(gè)更好用的可維護(hù)的工具,此時(shí),對(duì)代碼的封裝、模塊化就顯得尤為重要,于是出現(xiàn)了兩種方案:查詢構(gòu)造器,對(duì)象關(guān)系映射

查詢構(gòu)造器 (query builder),顧名思義,它的目的就是以簡便的形式構(gòu)造、執(zhí)行 SQL,為查詢數(shù)據(jù)庫的業(yè)務(wù)提供了方便好用的接口,一些知名的 web 框架如 PHP 的 Laravel、CodeIgniter、ThinkPHP 等都提供了好用的查詢構(gòu)造器。

對(duì)象關(guān)系映射 (ORM) 是一種更面向?qū)ο蟮臄?shù)據(jù)模型化操作,將數(shù)據(jù)庫的數(shù)據(jù)映射成對(duì)象模型,數(shù)據(jù)庫的直接操作對(duì)開發(fā)者透明,開發(fā)者只需關(guān)注對(duì)象模型即可,更符合面向?qū)ο蟪绦蛩季S。同樣,很多框架也提供了 ORM 的方式去操作數(shù)據(jù)。

為什么要寫查詢構(gòu)造器,我的需求是什么

寫這個(gè)查詢構(gòu)造器的起因是 workerman,一個(gè)由 PHP 編寫的、可以常駐內(nèi)存的 Socket 框架。

當(dāng)時(shí)選用 workerman 去做一個(gè) webAPI 的項(xiàng)目,針對(duì) workerman 的環(huán)境編寫了一個(gè)簡單的 http 框架 WorkerA,一是沒有找到合適的 (在一個(gè)非典型 web 環(huán)境中,想要一個(gè)類似 laravel 那樣方便的查詢構(gòu)造器),二是想要鍛煉自己,于是選擇了自己去寫這個(gè)查詢構(gòu)造器。

如今該查詢構(gòu)造器已經(jīng)完工,完整代碼在我的框架核心代碼中: 查看

Q&A

Q:為什么選擇查詢構(gòu)造器而不是 ORM

A:對(duì)于我自己的需求,我需要一個(gè)簡單好用又快速的工具,ORM 的性能和復(fù)雜性顯然不合適。


Q:該查詢構(gòu)造器“特殊”在何處

A:區(qū)別于典型 web 的一次 HTTP 請(qǐng)求的代碼運(yùn)行周期,這個(gè)查詢構(gòu)造器除了可以使用在普通的 web 環(huán)境中,還支持常駐內(nèi)存的環(huán)境,支持?jǐn)嗑€重連 (這個(gè)很重要)


Q:為什么選 PHP

A:因?yàn)槲易约河?PHP 開發(fā)最多,重要的是 workerman 是 PHP 編寫的。


Q:支持哪些數(shù)據(jù)庫

A:目前支持了 Mysql、Postgresql、Sqlite 這三個(gè)數(shù)據(jù)庫,而且全部通過了單元測(cè)試


Q:好的使用實(shí)踐?

A:我在 workerman 的環(huán)境中使用的是單例模式,每個(gè)進(jìn)程一個(gè)數(shù)據(jù)庫連接單例模型。典型 web 環(huán)境下按照一般的查詢構(gòu)造器處理就行。同樣常駐內(nèi)存的情景可以自己寫鏈接池之類的功能,當(dāng)然這和查詢構(gòu)造器本身沒有關(guān)系,一切由你的需求來決定。

需求和技術(shù)的選擇 (想想自己想要什么)

底層驅(qū)動(dòng)的選擇:

php 提供了 mysql 和 pgsql 這些常用數(shù)據(jù)庫的擴(kuò)展,但是每個(gè)擴(kuò)展暴露出的接口都不大一樣,封裝不便,pass

php 的 PDO 提供了多種數(shù)據(jù)庫的底層驅(qū)動(dòng),統(tǒng)一了訪問接口,prepare 方法可以有效的防止 SQL 注入,就選它

錯(cuò)誤異常處理:

使用 PHP 的 try catch 機(jī)制,使用內(nèi)置的異常和 PDO 的異常進(jìn)行異常拋出

代碼結(jié)構(gòu)的設(shè)計(jì):

查詢構(gòu)造器要支持多個(gè)數(shù)據(jù)庫,我們要把相同的部分 (查詢等) 封裝起來,將不同的部分 (不同數(shù)據(jù)庫的連接和設(shè)置) 獨(dú)立開來,那么只需創(chuàng)建一個(gè)基類 (封裝 PDO 的操作),每個(gè)數(shù)據(jù)庫多帶帶建立一個(gè)類繼承基類,將各自差異的部分重寫即可。

SQL 的構(gòu)建:

sql 的構(gòu)建屬于字符串的操作,構(gòu)建 sql 即是構(gòu)造字符串,PHP 有豐富的字符串處理函數(shù)

好用和性能的均衡考慮:

有些工具好用但是性能不一定好 (比如正則表達(dá)式),當(dāng)然并不是說為了語言層面的極致性能而放棄一些便易性,查詢構(gòu)造器的瓶頸一般在于連接數(shù)據(jù)庫的網(wǎng)絡(luò)消耗和數(shù)據(jù)庫對(duì) SQL 的執(zhí)行上。那么我們就以此作為平衡點(diǎn),只要不比平衡點(diǎn)慢,我們可以選擇更方便開發(fā)的方式寫代碼。

測(cè)試:

選擇 phpunit 作為單元測(cè)試工具,以可測(cè)試為前提拆分代碼為最小單元,提升代碼的可維護(hù)性

總體思路

進(jìn)行相關(guān)的需求分析和技術(shù)選擇后,我們得出了構(gòu)建查詢構(gòu)造器的大概的思路:

基于 PDO

通過字符串操作構(gòu)建 SQL

將構(gòu)造好的字符串交給 PDO 執(zhí)行,獲取結(jié)果

以繼承、重寫的模式搭建代碼的架子

錯(cuò)誤異常處理

編寫單元測(cè)試

理清思路,開始干活。

(本系列文章默認(rèn)您已經(jīng)掌握 PHP、PDO、SQL 的基礎(chǔ)知識(shí))

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/28695.html

相關(guān)文章

  • 一個(gè)特殊查詢構(gòu)造器 - (三、條件查詢)

    摘要:構(gòu)造條件如果單單是執(zhí)行這樣的語句,使用原生擴(kuò)展就好了,使用查詢構(gòu)造器就是殺雞用牛刀。這一篇,我們來講講如何使用查詢構(gòu)造器進(jìn)行條件查詢。 構(gòu)造 where 條件 如果單單是執(zhí)行 SELECT * FROM test_table; 這樣的語句,使用原生擴(kuò)展就好了,使用查詢構(gòu)造器就是殺雞用牛刀。當(dāng)然,在實(shí)際的業(yè)務(wù)需求中,大部分的 SQL 都沒這么簡單,有各種條件查詢、分組、排序、連表等操作,...

    why_rookie 評(píng)論0 收藏0
  • PHP 開發(fā)者如何做代碼審查?

    摘要:我們做代碼審計(jì)之前選好工具也是十分必要的。一審計(jì)工具介紹代碼審計(jì)系統(tǒng)功能介紹是一款基于開發(fā)的針對(duì)代碼安全審計(jì)的軟件。自定義審計(jì)規(guī)則。黑盒敏感信息泄露一鍵審計(jì)。挖掘這種漏洞主要是檢查是否使用了,搜索和。 GitChat 作者:湯青松原文:PHP 開發(fā)者如何做代碼審查?關(guān)注微信公眾號(hào):「GitChat 技術(shù)雜談」 一本正經(jīng)的講技術(shù) 【不要錯(cuò)過文末彩蛋】 前言 工欲善其事,必先利其器。我們做...

    Achilles 評(píng)論0 收藏0
  • 一個(gè)特殊查詢構(gòu)造器 - (八、單元測(cè)試、收尾工作)

    摘要:單元測(cè)試的好處是給開發(fā)人員的,并不是給機(jī)器的。對(duì)于查詢構(gòu)造器這個(gè)項(xiàng)目,我們可以讓其在遠(yuǎn)程運(yùn)行環(huán)境安裝相關(guān)數(shù)據(jù)庫軟件,執(zhí)行數(shù)據(jù)表建立,數(shù)據(jù)導(dǎo)入,執(zhí)行單元測(cè)試等操作。查詢構(gòu)造器的完整代碼查詢構(gòu)造器的單元測(cè)試完整代碼。 debug 模式 對(duì)查詢構(gòu)造器進(jìn)行調(diào)試并不難,從其構(gòu)造 SQL -> 數(shù)據(jù)綁定 -> SQL 執(zhí)行的過程中就能發(fā)現(xiàn),要方便調(diào)試,只要可以觀察以下信息: 構(gòu)造的 SQL 綁定...

    Steve_Wang_ 評(píng)論0 收藏0
  • 一個(gè)特殊查詢構(gòu)造器 - (六、關(guān)聯(lián))

    摘要:雖然現(xiàn)在這樣的情況已經(jīng)很少,但是對(duì)于查詢構(gòu)造器而言,還是要提供一個(gè)方便的方法來對(duì)表前綴進(jìn)行設(shè)置,特別是當(dāng)你沒有權(quán)限修改表名的時(shí)候。所以我們將表前綴作為一個(gè)配置參數(shù)傳入查詢構(gòu)造器,在查詢構(gòu)造器的底層進(jìn)行自動(dòng)前綴添加。 關(guān)聯(lián)查詢是關(guān)系型數(shù)據(jù)庫典型的查詢語句,根據(jù)兩個(gè)或多個(gè)表中的列之間的關(guān)系,從這些表中查詢數(shù)據(jù)。在 SQL 標(biāo)準(zhǔn)中使用 JOIN 和 ON 關(guān)鍵字來實(shí)現(xiàn)關(guān)聯(lián)查詢。 Join 子...

    rainyang 評(píng)論0 收藏0
  • 一個(gè)特殊查詢構(gòu)造器 - (五、聚合函數(shù)、分組、排序、分頁)

    摘要:聚合函數(shù)在中,有一些用來統(tǒng)計(jì)匯總的函數(shù),被稱作聚合函數(shù),如等。方法其它方法如之類的編寫就不一一展示了,代碼請(qǐng)看聚合函數(shù)。如何獲取總數(shù)當(dāng)然是使用上面講到的聚合函數(shù)來處理。 where 相關(guān)的子句構(gòu)造完成后,我們繼續(xù)構(gòu)造其它子句。這一篇我們進(jìn)行聚合函數(shù)、分組、排序等子句的構(gòu)造。 聚合函數(shù) 在 SQL 中,有一些用來統(tǒng)計(jì)、匯總的函數(shù),被稱作聚合函數(shù),如 SUM、COUNT、AVG 等。 使用...

    iamyoung001 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<