寫一個「特殊」的查詢構造器 - (1、程序結構,基礎封裝)mysql
寫一個「特殊」的查詢構造器 - (2、第一條語句)laravel
寫一個「特殊」的查詢構造器 - (4、條件查詢:複雜條件)程序員
寫一個「特殊」的查詢構造器 - (5、聚合函數、分組、排序、分頁)github
寫一個「特殊」的查詢構造器 - (7、DML 語句、事務)正則表達式
寫一個「特殊」的查詢構造器 - (8、單元測試、收尾工做)sql
此項目已經從 WorkerA 中拆分爲獨立項目,完整代碼請到 wazsmwazsm/DB 中查看。數據庫
對於後端程序員來講,數據庫操做是必備知識,對數據的增刪查改也是業務中最廣泛、頻繁的操做。
對於關係型數據庫,如 Mysql、Postgresql 等,咱們可使用 SQL (Structured Query Language) 來操做咱們的數據,如 「SELECT * FROM test;」 這類的 SQL 語句,大部分的編程語言如 PHP、Python、go 等都提供了相應的數據庫擴展,能夠方便的進行數據庫鏈接、執行 SQL 獲取結果。
可是,直接使用基礎的擴展效率並不高,每次都要建立鏈接、手動寫 SQL、對執行結果進行判斷、將查詢獲得的數據進行處理等,代碼的重用性和維護性並非很好,在多人開發的時候更是不能保證代碼質量。而在項目開發中,咱們想要的是一個更好用的可維護的工具,此時,對代碼的封裝、模塊化就顯得尤其重要,因而出現了兩種方案:查詢構造器,對象關係映射。
寫這個查詢構造器的原由是 workerman,一個由 PHP 編寫的、能夠常駐內存的 Socket 框架。
當時選用 workerman 去作一個 webAPI 的項目,針對 workerman 的環境編寫了一個簡單的 http 框架 WorkerA,一是沒有找到合適的 (在一個非典型 web 環境中,想要一個相似 laravel 那樣方便的查詢構造器),二是想要鍛鍊本身,因而選擇了本身去寫這個查詢構造器。
現在該查詢構造器已經完工,完整代碼在個人框架核心代碼中: 查看
Q:爲何選擇查詢構造器而不是 ORM
A:對於我本身的需求,我須要一個簡單好用又快速的工具,ORM 的性能和複雜性顯然不合適。
Q:該查詢構造器「特殊」在何處
A:區別於典型 web 的一次 HTTP 請求的代碼運行週期,這個查詢構造器除了可使用在普通的 web 環境中,還支持常駐內存的環境,支持斷線重連 (這個很重要)
Q:爲何選 PHP
A:由於我本身用 PHP 開發最多,重要的是 workerman 是 PHP 編寫的。
Q:支持哪些數據庫
A:目前支持了 Mysql、Postgresql、Sqlite 這三個數據庫,並且所有經過了單元測試
Q:好的使用實踐?
A:我在 workerman 的環境中使用的是單例模式,每一個進程一個數據庫鏈接單例模型。典型 web 環境下按照通常的查詢構造器處理就行。一樣常駐內存的情景能夠本身寫連接池之類的功能,固然這和查詢構造器自己沒有關係,一切由你的需求來決定。
底層驅動的選擇:
錯誤異常處理:
代碼結構的設計:
SQL 的構建:
好用和性能的均衡考慮:
測試:
進行相關的需求分析和技術選擇後,咱們得出了構建查詢構造器的大概的思路:
理清思路,開始幹活。
(本系列文章默認您已經掌握 PHP、PDO、SQL 的基礎知識)