参考文章:[Python web开发实战
使用 MySQL
数据时动态网站的基础,如果把数据放进数据库,就可以通过数据库管理系统对数据进行管理。MySQL 是一个开源的关系型数据库管理系统。它性能高,免费,配置简单,可靠性好,已经成为最流行的开源数据库。
在 Flask 应用中可以自由使用 MySQL,PostgreSQL,SQLite,Redis,MongoDB 来写原生的语句实现功能,也可以使用更高级的数据库抽象方式,如 SQLAlchemy 或 Mongoengine 这样的 ORM。
安装 MySQL 和驱动
安装以及配置 MySQL
安装 MySQL 此处略,自行查找安装方法
安装驱动
Python2 使用的是 mysql-python 驱动,安装方法:
1 | pip install mysql-python |
Python3 使用的是 mysqlclient,安装之前需要先安装系统依赖库:
1 | sudo yum install python3-devel mysql-devel |
然后执行如下语句安装 mysqlclient
1 | pip install mysqlclient |
使用 MySQLdb 写原生语句
下面会编写一系列数据库开发的例子,为了重复利用,把常量放到独立的 consts.py
文件里面:
1 | HOSTNAME = '127.0.0.1' |
例子一(example1.py)
1 | 1 import MySQLdb |
分析一下这个程序的细节:
- 第5行,MySQLdb.connect 返回的 con 是一个数据库连接实例。使用完通过 con 关闭数据库连接是一个好习惯。
- 第6行,con.cursor() 返回一个游标,数据库操作都是在游标实例上执行的;
- 第7行,cur.execute 方法传入的就是要执行的 SQL 语句;
- 第8行,cur.fetchone() 返回执行结果,这一点一开始可能不适应,因为数据库操作的结果不是在 execute 中直接返回的,而是需要使用 fetchone,fetchall,fetchmany 这样的方法获取结果。
数据库操作主要以 CRUD 为主。CRUD 是 Create(创建), Read(读取), Update(更新) 和 Delete(删除) 的缩写。再来看一个 CRUD 的例子。
例子二(curd.py)
1 | import MySQLdb |
这次使用了 with 语句。cursor 的 __enter__
方法返回了游标,在 with 中执行结束,它会判断当前是否有错误,有错误就回滚,没有则进行事务提交,相当于无需自己来写下面这样的异常处理:
1 | try: |
注意:在新版本的 mysqlclient 驱动中删除了上下文管理器方法,所以要使用上下文管理器的话必须自己写一个上下文管理器,如下上所示。
事务提交和回滚
事务主要用于处理操作量大,复杂度高的数据。如果操作的是一系列的动作,比如删除一个用户,不仅需要删除用户表中对应的记录,也要删除和用户表关联的表中对应的数据,甚至还有其他业务上的需要。这个时候事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行。
MySQL 的 InnoDB 引擎支持事务,而默认的 MyISAM 引擎不支持,需要根据业务来取舍。