python之PyMysql
1. 前言
- 不同的数据库在python的使用需要引入不同的模块,代码大同小异,这里以mysql为例子,mysql对应的模块有很多,官方推荐为PyMySQL。
- PyMySQL 是在 Python3.x 版本中用于连接 MySQL 服务器的一个库,Python2中则使用mysqldb。
- PyMySQL 遵循 Python 数据库 API v2.0 规范,并包含了 pure-Python MySQL 客户端库。
pip3 install PyMySQL
import PyMySQL
数据库其实就是一个网络服务器,所有的数据库都是基于tcp协议,因此需要host和账号密码。
在PyMySQL中两个重要的对象,分别为Connection对象和Cusor对象。
2. Connection对象(连接对象)
2.1 作用
用于建立与数据库的连接
2.2 创建Connection对象
conn = connect(参数列表)
参数说明:
host: 连接的mysql主机,如果为本机,可以填‘lolcalhost’
port: 连接的mysql主机的端口,默认为3306,一般不是改。
db: 待连接的数据库名
user: 连接的用户名
password: 连接的密码
charset: 通信采用的编码方式,默认是’gb2312’,要求与数据库创建时指定的编码一致,否则中文或乱码
2.3 对象的方法
2.3.1 关闭连接 close()
网络服务会消耗大量资源,需要关闭连接,关闭连接为了释放资源供计算机其它进程使用。
2.3.2 事务相关方法
-
commit() 事务提交
-
rollbak() 事务回滚
3. Cursor对象(操作数据库对象)
3.1 作用
用于执行SQL语句(所有SQL类型的语句)
3.2 创建Cursor对象
利用Connection对象中的cursor()方法,创建Cursor对象。
cursor = conn.cursor()
3.3 Cursor对象方法
3.3.1 关闭 close()
数据库连接关闭了,Cursor也关闭了;
先关cursor,再关Connect。
3.3.2 执行SQL语句execute()
execute(SQL语句),返回受影响的行数
3.3.3 执行查询语句 fetchone()
fetchone()执行查询语句时,获取查询结果集的第一个行数据,返回一个元组
3.3.4 获取当前行的下一行 next()
3.3.5 查询所有结果 fetachall()
获取结果集的所有集,一行构成一个元组,再将这些元组组入一个元组返回。
4. 案例
案例参考: Python3 MySQL 数据库连接 - PyMySQL 驱动
- 在进行数据库操作时,要进行异常捕获,防止数据库操作错误。如:
#!/usr/bin/python3
import pymysql
# 打开数据库连接
db = pymysql.connect("localhost","testuser","test123","TESTDB" )
# 使用cursor()方法获取操作游标
cursor = db.cursor()
# SQL 插入语句
# 方法1
sql = """INSERT INTO EMPLOYEE(FIRST_NAME,
LAST_NAME, AGE, SEX, INCOME)
VALUES ('Mac', 'Mohan', 20, 'M', 2000)"""
# 方法2
sql = """INSERT INTO EMPLOYEE(FIRST_NAME,
LAST_NAME, AGE, SEX, INCOME)
VALUES (‘%s’, ‘%s’, %s, ‘%s’, %s)"""%('Mac', 'Mohan', 20, 'M', 2000)
# 方法3: 极力推荐,在SQL中使用格式化,在excute中传入
sql = """INSERT INTO EMPLOYEE(FIRST_NAME,
LAST_NAME, AGE, SEX, INCOME)
VALUES (%s, %s, %s, %s, %s)"""
try:
# 执行sql语句
# 方法1和方法2
cursor.execute(sql)
#方法3:
cursor.execute(sql, ('Mac', 'Mohan', 20, 'M', 2000))
# 提交到数据库执行
db.commit()
except:
# 如果发生错误则回滚
db.rollback()
finally:
# 关闭数据库连接
db.close()
- 在创建connections对象时,自动加入了事务处理。自动开启了begin,只需要执行commit()或者roolback()即可。
- 利用python格式化写SQL语句时,一定要主要引号’’,在SQL语句中字符串存在 引号’’, 在利用python格式化写SQL语句时一定要加上’%s’,如上述方法2.
- 方法3在调用excute()方法时,会自动给传入的字符串加上引号;极力推荐方法三书写方法,方法二存在安全隐患,如:
sql = "select * from 表名 where 字段 > %s" %("zs or 1 = 1")
会将所有数据都给查询出来。
问题:为什么调用excute()就不会??待验证
5. SQL语句的封装
SQL语句在python中千篇一律,为了后续更加方便使用代码,对SQL语句进行封装。