今天项目已经能够做一个简单的后端服务了,在mysql中新建一个表,就能自动提供restful api的CURD服务了。
关键点
- 根据REST的四种动词形式,动态调用相应的CURD方法;
- 编写REST与基础数据库访问类之间的中间层(baseDao),实现从REST到数据访问接口之间能用业务逻辑处理;
- 编写基础数据库访问类(dehelper),实现从字典形式的参数向SQL语句的转换;
实现的rest-api
实现了如下形式的rest-api
1 | 复制代码[GET]/rs/users/{id} |
基础数据库访问类
该类实现与pymysql库的对接,提供标准CURD接口。
准备数据库表
在数据库对应建立users表,脚本如下:
1 | 复制代码CREATE TABLE `users` ( |
新建数据库配置文件(configs.json)
数据连接配置,不入版本库。
1 | 复制代码{ |
对接pymysql接口
用函数exec_sql封装pymysql,提供统一访问mysql的接口。is_query函数用来区分是查询(R)还是执行(CUD)操作。出错处理折腾了好久,插入异常返回的错误形式与其它的竟然不一样!返回参数是一个三元组(执行是否成功,查询结果或错误对象,查询结果数或受影响的行数)
1 | 复制代码with open("./configs.json", 'r', encoding='utf-8') as json_file: |
查询接口
pymysql的查询接口,可以接受数组,元组和字典,本查询接口使用数组形式来调用。现在此接口只支持与条件组合参数。
1 | 复制代码def select(tablename, params={}, fields=[]): |
插入接口
以数组形式提供参数,错误信息解析与其它接口不同。
1 | 复制代码def insert(tablename, params={}): |
修改接口
以字典形式提供参数,占位符的形式为:%(keyname)s,只支持按主键进行修改。
1 | 复制代码def update(tablename, params={}): |
删除接口
以字典形式提供参数,占位符的形式为:%(keyname)s,只支持按主键进行删除。
1 | 复制代码def delete(tablename, params={}): |
中间层(baseDao)
提供默认的操作数据库接口,实现基础的业务逻辑,单表的CURD有它就足够了。有复杂业务逻辑时,继承它,进行扩展就可以了。
1 | 复制代码import dbhelper |
动态调用CURD
根据客户调用的rest方式不同,动态调用baseDao的相应方法,这个很关键,实现了它才能自动分配方法调用,才能只需要建立一个数据表,就自动提供CURD基本访问功能。还好,动态语言能很方便的实现这种功能,感慨一下,node.js更方便且符合习惯^_^
1 | 复制代码 method = { |
说明:
- table是前一章中解析出来的数据表名,这块就是users;
- method应该是定义一个常量对象,对应rest的动词,因为对ypthon不熟,定义了一个变量先用着,查了下常量说明,看着好复杂;
- request.method 客户请求的实际rest动词;
- params是前一章中解析出来的参数对象;
完整代码
1 | 复制代码git clone https://github.com/zhoutk/pyrest.git |
小结
至此,我们已经实现了基本的框架功能,以后就是丰富它的羽翼。比如:session、文件上传、跨域、路由改进(支持无缝切换操作数据库的基类与子类)、参数验证、基础查询功能增强(分页、排序、模糊匹配等)。感慨一下,好怀念在node.js中json对象的写法,不用在key外加引号。
补丁
刚把基础数据库访问类中的insert方法的参数形式改成了字典,结果异常信息也正常了,文章不再改动,有兴趣者请自行查阅源代码。
本文转载自: 掘金