我在BAT学到的技术工具-数据库访问组件-python版本

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)


    数据流从左侧迁移到右侧
  • python-orm 选型参考

  • sqlalchemy
    使用说明

豆瓣后端使用的orm工具
pip install sqlalchemy

  • FAQ:是否会带来性能降低

Notice that the Core and raw SQL achieved comparable insertion speed while the ORM is much slower than the other two.

  • FAQ:数据库以及表结构变更代码需要怎样变化

  • 使用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)

  • 说明

    1. 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)

你可能感兴趣的:(我在BAT学到的技术工具-数据库访问组件-python版本)