1. 面对的问题
编写可以灵活&高效访问数据库的程序,以python为例。
性能要好:无fd,内存泄漏;
灵活变更:数据库表变更,程序需要变更的地方明确,且改动尽量简单;
备注:互联网产品使用mysql,一般分为线上和线下数据库,需要关注的点也不尽相同,本次以线下离线数据库为例。
2. 现在的实现方式:python db-api
![python代码片段1](http://7u2g5z.com1.z0.glb.clouddn.com/屏幕快照 2015-01-12 下午3.18.23.png)
![python代码片段2](http://7u2g5z.com1.z0.glb.clouddn.com/屏幕快照 2015-01-12 下午3.18.42.png)
说明
cnt:mysql每次查询的context,每次连接并关闭,无连接池管理。
sql:字符串,自己拼装的sql语句,修改容易出错。
obj_data:sql查询获得的结果集,通过偏移index访问。-
缺点
- 查询数据库每次重新建立连接不合理。
- 查询语句手动维护,修改容易出错,需要同时看mysql表的schema来修改。
- 查询结果集根据偏移量来访问,不易于变更,如:列的顺序变化。
3. 一个优化解决方案
-
ORM(Object Relational Mapping)
sqlalchemy
使用说明
豆瓣后端使用的orm工具
pip install sqlalchemy
Notice that the Core and raw SQL achieved comparable insertion speed while the ORM is much slower than the other two.
使用sqlalchemy建立数据库和表的例子
![根据类声明创建2张表](http://7u2g5z.com1.z0.glb.clouddn.com/屏幕快照 2015-01-15 下午2.07.20.png)
![根据类声明创建2张表并添加一些数据](http://7u2g5z.com1.z0.glb.clouddn.com/屏幕快照 2015-01-15 下午4.58.28.png)-
说明
- session支持复用
使用sqlalchemy查询表的例子
![查询表的示例](http://7u2g5z.com1.z0.glb.clouddn.com/屏幕快照 2015-01-15 下午7.31.44.png)
3. 另一个解决方案
- 也有很多时候我们希望开放&共享mysql中的数据
这就需要有支持快速搭建restful web接口和字段说明的服务
- beego:一个使用 Go 的思维来帮助您构建并开发 Go 应用程序的开源框架
- 视频教程: beego 一分钟创建API
- 安装
jumbo install go
go get github.com/astaxie/beego
生成方法2中的数据表restful web服务
线上例子 : employee,department
![web界面示例1](http://7u2g5z.com1.z0.glb.clouddn.com/屏幕快照 2015-01-15 下午8.12.05.png)
![web界面示例2](http://7u2g5z.com1.z0.glb.clouddn.com/屏幕快照 2015-01-15 下午8.11.43.png)数据库表 + beego可以快速提供json形式的接口
![使用curl简单的访问](http://7u2g5z.com1.z0.glb.clouddn.com/屏幕快照 2015-01-16 下午2.44.18.png)