一.Python Database API
现在外面流行很多种数据库,如如PostgreSQL、MySQL或者SQLite,每个数据库都有自己的操作语句和命令。如果需要了解请查阅相关文档帮助。
所有数据库的大多数基本功能都相同,因此从理论上说,对于使用其中一种数据库的程序,很容易对其进行修改以使用另一种数据库。问题是即便不同模块提供的功能大致相同,它们的接口(API)也是不同的。为解决Python数据库模块存在的这种问题,人们一致同意开发一个标准数据库API(DB API)。这个API的最新版本(2.0)是在PEP 249(Python Database API Specification v2.0)中定义的,网址为python Database API V2.0.
下面我们简单介绍下这个API V2.0:
- 1.connection对象:建立python客户端与数据库的连接,使用pymysql.Connect(参数)方法来创建。
参数解释:
参数名 | 类型 | 说明 |
---|---|---|
host | 字符串 | 数据库服务器地址 |
port | 数字 | 数据 |
库服务器端口号 | ||
user | 字符串 | 用户名 |
password | 字符串 | 密码 |
db | 字符串 | 数据库名称 |
charset | 字符串 | 连接编码 |
方法:
方法名 | 说明 |
---|---|
cursor() | 使用该连接创建并返回游标 |
commit() | 提交当前事物 |
rollback() | 回滚当前事物 |
close() | 关闭连接 |
- 2.cursor对象:用于执行查询和获取结果,由connection.cursor()获得。
支持的方法:
参数名 | 说明 |
---|---|
execute(op[args]]) | 执行一个数据库查询和命令 |
fetchone() | 获取结果集的下一行 |
fetchmany(size) | 获取结果集的下几行 |
fetchall() | 获取结果集剩下所有行 |
rowcount | 最近一次execute返回数据的行数或影响行数 |
close() | 关闭游标对象 |
execute方法执行过程:
fetch* 方法:在表格中有一个rownumber指向某一行,开始rownumber指向数据的第一行,每次通过fetch* 方法获得数据,rownumber就会向下移动,移动的行数为刚刚获取到的结果个数。
下面会通过例子讲解。
二.SELECT语句
直接看例子:
要处理的表如下:
import pymysql
conn = pymysql.connect(host = "localhost",user = "root", db = "school", password = "ahcola@xc",port = 3306, charset = "utf8"); #创建连接
cursor = conn.cursor(); #获取游标
sql_select = "SELECT * FROM student"
cursor.execute(sql_select) #执行sql语句
print(cursor.rowcount); #打印缓存区内的行数
rs = cursor.fetchone(); #获得一个记录
print(rs)
rs = cursor.fetchmany(2); #获得2个记录
print(rs)
rs = cursor.fetchall() #获得剩下所有记录
for row in rs:
print("ID = %d, NAME = %s, SEX = %s" % row)
cursor.close(); #关闭游标
conn.close(); #断开连接
执行结果:
三.INSERT,UPDATE和DELETE语句
首先我们要知道python,mysql数据库是有事务处理机制的,所有的操作都在事务里面进行,事务需要提交,才能保存结果。事务有原子性,一致性,隔离性,持久性。
- 原子性:事务中的操作要么都做,要么都不做
- 一致性:事务必须使数据库从一致性状态变为另一个一致性状态
- 隔离性:一个事务的执行不能被其他事务干扰
- 持久性:事务一旦提交,它对数据库的改变就是永久性的
事务的操作:
- 关闭自动commit:设置conn.autocommit(False),python mysql中已经自动为我们设置为False了,所以不需要在设置。
- 正常结束事务:conn.commit()。
- 异常结束事务:conn.rollback()。
下面看一个例子:
表格起始状态:
import pymysql
conn = pymysql.connect(host = "localhost",user = "root", db = "school", password = "ahcola@xc",port = 3306, charset = "utf8");
cursor = conn.cursor();
sql_insert = "INSERT INTO student(ID, NAME, SEX) VALUES(7, '何有胜', '男')";
sql_update = "UPDATE student SET ID=4 WHERE NAME='马天乐'";
sql_delete = "DELETE FROM student WHERE ID<=2";
sql_select = "SELECT * FROM student";
cursor.execute(sql_select);
print(cursor.fetchall());
cursor.execute(sql_insert);
cursor.execute(sql_select);
print(cursor.fetchall());
cursor.execute(sql_update);
cursor.execute(sql_select);
print(cursor.fetchall());
cursor.execute(sql_delete);
cursor.execute(sql_select);
print(cursor.fetchall());
cursor.close();
conn.close();
执行结果:
在看数据库发现,更新后发现数据库并未改变:
这是因为我们虽然进行了一些操作,但是事务并未提交。所以应添加conn.commit()语句。
conn.commit(); #提交事务
在看结果,变化了:
四.异常处理
如果某一sql语句出现问题,怎么办,一般我们的处理方法,是添加try块,然后进行事务回滚。例如将上面的UPDATE语句改为 sql_update = “UPDATE student SET ID1=4 WHERE NAME=‘马天乐’”,要知道我们的表格中并没有ID1这个字段,所以程序执行到这里会出错,所以这时就应该添加异常处理了,如下: