在一个Web App中,所有的数据,包括用户的信息,日志,评论等,都存在数据库中。在piblog中使用MySQL作为数据库。
Web App中由很多地方需要使用数据库。访问数据库需要创建数据库连接、游标对象,然后执行SQL操作,最后处理异常,清理资源。这些访问数据库的代码如果分散在不同的函数中,势必无法维护,也不利于代码复用。
此外,对于一个Web App,会有多个用户同时访问,系统以多线程或多进程的方式来处理每个用户的请求。以多线程为例,每个线程在访问数据库时,都必须创建属于自己的连接,对别的线程不可见,否则,就会造成数据库操作混乱。
所以,我们还要创建一个简单的数据库访问模型,在一个线程中,能既安全又简单地操作数据库。
不选择SQLAlchemy的原因:SQLAlchemy太庞大,API太庞大。(我现在还不会)
于是决定设计一个封装了基本的SELECT、INSERT、UPDATE和DELETE操作的db模块:basic.db
设计db接口
设计底层模块的原则时,根据上层调用者设计简单易用的API接口,然后,实现模块内部代码。
假设basic.db模块已经编写完毕,我们希望通过如下的方式来调用它:
首先,初始化数据库连接信息,通过create_engine()函数:

from basic import db
db.create_engine(user='root', password='password', database='test', host='127.0.0.1', port=3306)

然后,就可以直接操作SQL了。
如果需要做一个查询,可以直接调用select()方法,返回的是list,每一个元素是用dict表示的对应的行:

users = db.select('select * from user')
users =>
[{ "id": 1, "name": "John" },{ "id": 2, "name": "Alex" },{ "id": 3, "name": "Lenovo" }
]

如果要执行INSERT、UPDATE或DELETE操作,直接执行update()方法,返回受影响的行数:

n = db.update('insert into user(id, name) values(?, ?)', 4, 'Alex')

update()函数签名为:

update(sql, *args)

统一用?作为占位符,并传入可变参数来绑定,从根本上避免SQL注入攻击。
每个select()或update()调用,都隐含地自动打开并关闭了数据库连接,这样,上层调用者就完全不必关心数据库底层连接。
但是,如果要在一个数据库中执行多个SQL语句怎么办?我们用一个with语句实现:

with db.connection():db.select('...')db.update('...')db.update('...')

实现db模块
由于模块是全局对象,模块变量是全剧唯一变量,所以,有两个重要的模块变量:

# db.py# 数据库引擎对象:
class _Engine(object):def __init__(self, connect):self._connect = connectdef connect(self):return self._connect()engine = None# 持有数据库连接的上下文对象:
class _DbCtx(threading.local):def __init__(self):self.connection = Noneself.transactions = 0def is_init(self):return not self.connection is Nonedef init(self):self.connection = _LazyConnection()self.transactions = 0def cleanup(self):self.connection.cleanup()self.connection = Nonedef cursor(self):return self.connection.cursor()_db_ctx = _DbCtx()

由于_db_ctx是threadlocal对象,所以它持有的数据库连接对每个线程来说都是不一样的。任何一个线程都无法访问到其它线程持有的数据库连接。
有了这两个全局变量,我们继续实现数据库连接的上下文,目的是自动获取和释放连接:

class _ConnectionCtx(object):def __enter__(self):global _db_ctxself.should_cleanup = Falseif not _db_ctx.is_init():_db_ctx.init()self.should_cleanup = Truereturn selfdef __exit__(self, exctype, excvalue, trackback):global _db_ctxif self.should_cleanup:_db_ctx.cleanup()def connection():return _ConnectionCtx()

piblog 0.2相关推荐

  1. piblog 0.1

    搭建开发环境 首先,确认系统安装的Python版本是2.7.x. $ python --version Python 2.7.10 然后,安装开发Web App需要的第三方库: $ sudo pip ...

  2. 估算带卷积核二分类0,3的网络的收敛时间和迭代次数

    制作一个网络分类minst的0和3求出这网络的迭代次数曲线表达式n(δ),和准确率表达式p-max(δ),用预期准确率去估算n,并推算需要的时间. 将minst的28*28的图片缩小到9*9,网络用一 ...

  3. 神经网络收敛标准与准确率之间的数学关系

    制作一个带一个3*3卷积核的神经网络,测试集是minst的0和2图片集,将28*28的图片缩小成9*9,隐藏层30个节点所以网络的结构是 S(minst0)-(con3*3)49-30-2-(1,0) ...

  4. 用共振频率去进行图片分类的尝试

    假设有一种物质,这种物质的原子核的质子数和电子数可以不同,允许质子的带电量不同,并且质子带负电,同时这个原子的电子不满足鲍利不相容原理,环境温度是 (1/1.3806505)*10^23k,电子波的频 ...

  5. 收敛标准对迭代次数影响

    制作一个n*n的网络,将收敛标准分别设定在,0.001,0.01,0.02,0.03,0.04,0.05,0.06,0.07,0.08,0.09,0.1,观察网络达到平衡时迭代次数的变化. 比如如图的 ...

  6. vue省市区三级联动mysql,js/json,html/jsp

    大家好,我是烤鸭: 省市区三级联动数据及页面: 测试的时候,发现少了几个地区,现在补上了,也优化了下排版. 如果你懒得复制和看的话,这里是打包的下载地址. 之前的资源地址也改了,http://down ...

  7. ZAM 3D 制作3D动画字幕 用于Xaml导出

    ZAM 3D 制作3D动画字幕 用于Xaml导出 原文:ZAM 3D 制作3D动画字幕 用于Xaml导出 原地址-> http://www.cnblogs.com/yk250/p/5662788 ...

  8. 将执行文件转化为bat批处理文件的工具(批处理文件方式提供)

    update 2006.4.25 15:20 支持64kb以上的执行文件/// @echo e 0100 4d 5a 90 0 3 0 0 0 4 0 0 0 ff ff 0 0 >>Da ...

  9. 完整的境外、港澳台、电信、移动、联通、教育网、国内其他ISP的IPv4列表(数据整理日期2022年4月)-IP列表太长只能份2篇发布(1/2)

    完整的境外.港澳台.电信.移动.联通.教育网.国内其他ISP的IPv4列表(数据整理日期2022年4月)-IP列表太长只能份2篇发布(1/2) 综述 境外(不含港澳台)IPv4地址 综述 企业所在地南 ...

最新文章

  1. Sequence(组合数学,集合不同元素的个数)
  2. 【Flutter】StatefulWidget 组件 ( 创建 StatefulWidget 组件 | MaterialApp 组件 | Scaffold 组件 )
  3. android分析windowManager、window、viewGroup之间关系
  4. 游戏美术干货:各大MOBA类游戏视觉包装设计解析
  5. 女士细线毛衣起多少针_从起针到缝合,教你织毛衣的各种要点(详细教程)
  6. mysql中datetime比较大小问题 (转的)
  7. oracle ora 03137,今天遇到奇怪的ORA-03137错误(包含trc文件)
  8. Notes on UNPv1 Ch.5
  9. linux每日命令(1):which
  10. chrome charset使用_SourceMap-使用教程
  11. HBuilderX 快捷键
  12. C虾仔笔记 - ScrollView垂向滚动视图
  13. 当我说转行大数据工程师时,众人笑我太疯癫,直到四个月后......
  14. 追踪邮件插件:Unlimited Email Tracker 安装——帮你时刻关注对方会不会点击你的邮件
  15. 西门子数控系统的机床数据采集
  16. 亚洲的音乐史料及其历史研究状况
  17. 如何消除图片锯齿 html,Html5 canvas drawImage图片抗锯齿
  18. TCP/IP四层模型与OSI七层参考模型(网络协议)
  19. js如何运行python代码_手把手教你如何使用Python执行js代码
  20. java计算机毕业设计社区电商平台系统源码+系统+数据库+lw文档+mybatis+运行部署

热门文章

  1. ​如何保护Java程序
  2. watch TV online for free
  3. 以后要把flex用起来
  4. windows cmd color颜色设置
  5. 线程安全的集合类、CopyOnWrite机制介绍(转)
  6. 在IntelliJ IDEA中创建Web项目
  7. Android下载文件(一)下载进度断点续传
  8. Provisioning Services 7.8 入门系列教程之十四 UEFI支持和BOOTPTAB 编辑器
  9. 问题-Delphi2007编译时提示内存错误“sxs.dll. No Debug Info.ACCESS 0xXXXXX
  10. C#GDI+图像处理