MySQL 笔记9 – PyMySQL
MySQL 系列笔记是笔者学习、实践MySQL数据库的笔记
参考文档:
MySQL 官方文档
SQL 教程
PyMySQL官方文档
一、基础
1、简介
- PyMySQL 是 Python 连接 MySQL 的驱动程序库
- 采用纯Python编写,运行效率相对较低,但可以和Python无缝连接
2、安装及导入
安装:
pip install PyMySQL
导入:
import pymysql
二、使用
1、PyMySQL 库
- 原理:PyMySQL 连接MySQL,然后把用SQL语言编写的操作数据库指令传递给MySQL,最后 MySQL 把结果返回供 PyMySQL 读取
- PyMySQL 库只有两个类:连接类(Connection)、游标类(Cursor)
- Connection:连接 MySQL
- Cursor:与 MySQL 进行交互,传送指令,读取结果
2、连接对象(Connection Objects)
获取连接对象:
pymysql.connect(host=None, user=None, password='', database=None, port=0)
参数:
- host:MySQL的主机IP地址,本机可使用 ‘localhost’ / 127.0.0.1
- user:登入用户名,MySQL 初始只有 ‘root’ 管理员用户
- password:登入密码
- database:连接的数据库名
- port:端口号,默认 3306
- 还有很多可选参数,具体可查看官方文档
属性和方法:
属性/方法 | 说明 |
---|---|
.autocommit_mode | 提交模式,默认为None 不自动提交 |
.open | 是否已连接,是返回 True,反之 |
.begin() | 开始事务(transaction) |
.commit() | 提交事务 |
.close() | 关闭数据库连接 |
.cursor(cursor=None) | 创建游标对象 |
.ping(reconnect=True) | 重新连接 |
.rollback() | 事务回滚 |
.select_db(db) | 选择数据库,db:数据库名称 |
.show_warnings() | 发送’SHOW WARNINGS’ 的 SQL 命令 |
- 每一次 .commit() 之前的所有SQL命令形成一个事务
- .commit() 之后默认开启事务
3、游标对象(Cursor Objects)
获取游标对象:
pymysql.connect(...).cursor()
属性和方法:
属性/方法 | 说明 |
---|---|
.execute(query, args=None) | 执行命令,query:SQL命令str类型,args:额外参数,tuple、list or dict |
.close() | 释放cursor对象 |
.executemany(query, args) | 执行多条命令,返回 Number of rows affected |
.fetchall() | 获取所有行 |
.fetchmany(size=None) | 获取size行 |
fetchone() | 获取一行 |
- execute() 中,如果 args 是 list/tuple,用 %s 传入query ;如果是dict,用%(name)s
4、异常
异常 | 说明 |
---|---|
Warning | 当有严重警告时触发,例如插入数据是被截断等等。必须是 StandardError 的子类。 |
Error | 警告以外所有其他错误类。必须是 StandardError 的子类。 |
InterfaceError | 当有数据库接口模块本身的错误(而不是数据库的错误)发生时触发。 必须是Error的子类。 |
DatabaseError | 和数据库有关的错误发生时触发。 必须是Error的子类。 |
DataError | 当有数据处理时的错误发生时触发,例如:除零错误,数据超范围等等。 必须是DatabaseError的子类。 |
OperationalError | 指非用户控制的,而是操作数据库时发生的错误。例如:连接意外断开、 数据库名未找到、事务处理失败、内存分配错误等等操作数据库是发生的错误。 必须是DatabaseError的子类。 |
IntegrityError | 完整性相关的错误,例如外键检查失败等。必须是DatabaseError子类。 |
InternalError | 数据库的内部错误,例如游标(cursor)失效了、事务同步失败等等。 必须是DatabaseError子类。 |
ProgrammingError | 程序错误,例如数据表(table)没找到或已存在、SQL语句语法错误、 参数数量错误等等。必须是DatabaseError的子类。 |
NotSupportedError | 不支持错误,指使用了数据库不支持的函数或API等。例如在连接对象上 使用.rollback()函数,然而数据库并不支持事务或者事务已关闭。 必须是DatabaseError的子类。 |
三、实例
import pymysql
# 连接数据库
connection = pymysql.connect(host='localhost',
user='root',
password='1234',
db='test',
charset='utf8')
try:
# 获取cursor,with语句结束后cursor自动close()
with connection.cursor() as cursor:
# 插入一行
sql = "INSERT INTO info(email, password) VALUES(%s, %s)"
cursor.execute(sql, ('123@qq.com', 'secret'))
# 提交事务
connection.commit()
with connection.cursor() as cursor:
# 读取记录
sql = "SELECT id,password FROM info WHERE email=%s"
cursor.execute(sql, ('123@qq.com',))
result = cursor.fetchone()
print(result)
except Exception as e:
# 发生错误时回滚
print(e)
connection.rollback()
finally:
# 关闭连接
connection.close()
GOOD LUCK!