写一个“特殊”的查询构造器 - (前言)

2018-05-06

分类 : PHP

更新

此项目已经从 WorkerA 中拆分为独立项目,完整代码请到 wazsmwazsm/DB 中查看。

文章目录

写一个“特殊”的查询构造器 - (前言)

写一个“特殊”的查询构造器 - (一、程序结构,基础封装)

写一个“特殊”的查询构造器 - (二、第一条语句)

写一个“特殊”的查询构造器 - (三、条件查询)

写一个“特殊”的查询构造器 - (四、条件查询:复杂条件)

写一个“特殊”的查询构造器 - (五、聚合函数、分组、排序、分页)

写一个“特殊”的查询构造器 - (六、关联)

写一个“特殊”的查询构造器 - (七、DML 语句、事务)

写一个“特殊”的查询构造器 - (八、单元测试、收尾工作)

前言

对于后端程序员来说,数据库操作是必备知识,对数据的增删查改也是业务中最普遍、频繁的操作。

对于关系型数据库,如 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&A

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 的基础知识)


上一篇 : Twitter snowflake ID 算法之 golang 实现
下一篇 : 写一个“特殊”的查询构造器 - (一、程序结构,基础封装)