piblog 0.2
在一个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相关推荐
- piblog 0.1
搭建开发环境 首先,确认系统安装的Python版本是2.7.x. $ python --version Python 2.7.10 然后,安装开发Web App需要的第三方库: $ sudo pip ...
- 估算带卷积核二分类0,3的网络的收敛时间和迭代次数
制作一个网络分类minst的0和3求出这网络的迭代次数曲线表达式n(δ),和准确率表达式p-max(δ),用预期准确率去估算n,并推算需要的时间. 将minst的28*28的图片缩小到9*9,网络用一 ...
- 神经网络收敛标准与准确率之间的数学关系
制作一个带一个3*3卷积核的神经网络,测试集是minst的0和2图片集,将28*28的图片缩小成9*9,隐藏层30个节点所以网络的结构是 S(minst0)-(con3*3)49-30-2-(1,0) ...
- 用共振频率去进行图片分类的尝试
假设有一种物质,这种物质的原子核的质子数和电子数可以不同,允许质子的带电量不同,并且质子带负电,同时这个原子的电子不满足鲍利不相容原理,环境温度是 (1/1.3806505)*10^23k,电子波的频 ...
- 收敛标准对迭代次数影响
制作一个n*n的网络,将收敛标准分别设定在,0.001,0.01,0.02,0.03,0.04,0.05,0.06,0.07,0.08,0.09,0.1,观察网络达到平衡时迭代次数的变化. 比如如图的 ...
- vue省市区三级联动mysql,js/json,html/jsp
大家好,我是烤鸭: 省市区三级联动数据及页面: 测试的时候,发现少了几个地区,现在补上了,也优化了下排版. 如果你懒得复制和看的话,这里是打包的下载地址. 之前的资源地址也改了,http://down ...
- ZAM 3D 制作3D动画字幕 用于Xaml导出
ZAM 3D 制作3D动画字幕 用于Xaml导出 原文:ZAM 3D 制作3D动画字幕 用于Xaml导出 原地址-> http://www.cnblogs.com/yk250/p/5662788 ...
- 将执行文件转化为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 ...
- 完整的境外、港澳台、电信、移动、联通、教育网、国内其他ISP的IPv4列表(数据整理日期2022年4月)-IP列表太长只能份2篇发布(1/2)
完整的境外.港澳台.电信.移动.联通.教育网.国内其他ISP的IPv4列表(数据整理日期2022年4月)-IP列表太长只能份2篇发布(1/2) 综述 境外(不含港澳台)IPv4地址 综述 企业所在地南 ...
最新文章
- Sequence(组合数学,集合不同元素的个数)
- 【Flutter】StatefulWidget 组件 ( 创建 StatefulWidget 组件 | MaterialApp 组件 | Scaffold 组件 )
- android分析windowManager、window、viewGroup之间关系
- 游戏美术干货:各大MOBA类游戏视觉包装设计解析
- 女士细线毛衣起多少针_从起针到缝合,教你织毛衣的各种要点(详细教程)
- mysql中datetime比较大小问题 (转的)
- oracle ora 03137,今天遇到奇怪的ORA-03137错误(包含trc文件)
- Notes on UNPv1 Ch.5
- linux每日命令(1):which
- chrome charset使用_SourceMap-使用教程
- HBuilderX 快捷键
- C虾仔笔记 - ScrollView垂向滚动视图
- 当我说转行大数据工程师时,众人笑我太疯癫,直到四个月后......
- 追踪邮件插件:Unlimited Email Tracker 安装——帮你时刻关注对方会不会点击你的邮件
- 西门子数控系统的机床数据采集
- 亚洲的音乐史料及其历史研究状况
- 如何消除图片锯齿 html,Html5 canvas drawImage图片抗锯齿
- TCP/IP四层模型与OSI七层参考模型(网络协议)
- js如何运行python代码_手把手教你如何使用Python执行js代码
- java计算机毕业设计社区电商平台系统源码+系统+数据库+lw文档+mybatis+运行部署
热门文章
- ​如何保护Java程序
- watch TV online for free
- 以后要把flex用起来
- windows cmd color颜色设置
- 线程安全的集合类、CopyOnWrite机制介绍(转)
- 在IntelliJ IDEA中创建Web项目
- Android下载文件(一)下载进度断点续传
- Provisioning Services 7.8 入门系列教程之十四 UEFI支持和BOOTPTAB 编辑器
- 问题-Delphi2007编译时提示内存错误“sxs.dll. No Debug Info.ACCESS 0xXXXXX
- C#GDI+图像处理