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

文章目录

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

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

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

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

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

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

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

写一个“特殊”的查询构造器 - (7、DML 语句、事务)正则表达式

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

更新

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

前言

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

对于关系型数据库,如 Mysql、Postgresql 等,咱们可使用 SQL (Structured Query Language) 来操做咱们的数据,如 “SELECT * FROM test;” 这类的 SQL 语句,大部分的编程语言如 PHP、Python、go 等都提供了相应的数据库扩展,能够方便的进行数据库链接、执行 SQL 获取结果。

可是,直接使用基础的扩展效率并不高,每次都要建立链接、手动写 SQL、对执行结果进行判断、将查询获得的数据进行处理等,代码的重用性和维护性并非很好,在多人开发的时候更是不能保证代码质量。而在项目开发中,咱们想要的是一个更好用的可维护的工具,此时,对代码的封装、模块化就显得尤其重要,因而出现了两种方案:查询构造器对象关系映射

  • 查询构造器 (query builder),顾名思义,它的目的就是以简便的形式构造、执行 SQL,为查询数据库的业务提供了方便好用的接口,一些知名的 web 框架如 PHP 的 Laravel、CodeIgniter、ThinkPHP 等都提供了好用的查询构造器。
  • 对象关系映射 (ORM) 是一种更面向对象的数据模型化操做,将数据库的数据映射成对象模型,数据库的直接操做对开发者透明,开发者只需关注对象模型便可,更符合面向对象程序思惟。一样,不少框架也提供了 ORM 的方式去操做数据。

为何要写查询构造器,个人需求是什么

写这个查询构造器的原由是 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 环境下按照通常的查询构造器处理就行。一样常驻内存的情景能够本身写连接池之类的功能,固然这和查询构造器自己没有关系,一切由你的需求来决定。

需求和技术的选择 (想一想本身想要什么)

底层驱动的选择:

  • php 提供了 mysql 和 pgsql 这些经常使用数据库的扩展,可是每一个扩展暴露出的接口都不大同样,封装不便,pass
  • php 的 PDO 提供了多种数据库的底层驱动,统一了访问接口,prepare 方法能够有效的防止 SQL 注入,就选它

错误异常处理:

  • 使用 PHP 的 try catch 机制,使用内置的异常和 PDO 的异常进行异常抛出

代码结构的设计:

  • 查询构造器要支持多个数据库,咱们要把相同的部分 (查询等) 封装起来,将不一样的部分 (不一样数据库的链接和设置) 独立开来,那么只需建立一个基类 (封装 PDO 的操做),每一个数据库单独创建一个类继承基类,将各自差别的部分重写便可。

SQL 的构建:

  • sql 的构建属于字符串的操做,构建 sql 便是构造字符串,PHP 有丰富的字符串处理函数

好用和性能的均衡考虑:

  • 有些工具好用可是性能不必定好 (好比正则表达式),固然并非说为了语言层面的极致性能而放弃一些便易性,查询构造器的瓶颈通常在于链接数据库的网络消耗和数据库对 SQL 的执行上。那么咱们就以此做为平衡点,只要不比平衡点慢,咱们能够选择更方便开发的方式写代码。

测试:

  • 选择 phpunit 做为单元测试工具,以可测试为前提拆分代码为最小单元,提高代码的可维护性

整体思路

进行相关的需求分析和技术选择后,咱们得出了构建查询构造器的大概的思路:

  • 基于 PDO
  • 经过字符串操做构建 SQL
  • 将构造好的字符串交给 PDO 执行,获取结果
  • 以继承、重写的模式搭建代码的架子
  • 错误异常处理
  • 编写单元测试

理清思路,开始干活。

(本系列文章默认您已经掌握 PHP、PDO、SQL 的基础知识)

相关文章
相关标签/搜索