pymysql是python中操作mysql数据库的一个优秀的模块,使用起来也是非常的简单和方便,只用记住几个下面标注红色的部分的用法就ok了。
从数据库的增删改查操作来学习pymysql:
import pymysql
# 导入模块
conn = pymysql.connect(host='localhost',user='root',password='root',port=3306,database='stupy',charset='utf8')
上面的代码是连接数据库,眼熟就对了,基本都是一个套路,有个地方需要说明下的是,后面的字符集,前几天在抓某宝商品评论的时候就遇到一个问题,评论内容里面包含了emoji,用上面的代码连接数据库执行入库操作的时候报错了:
Incorrect string value: '\xF0\x9F\x98\x84'
一脸懵啊有没有,查了下才发现是emoji表情的问题,解决的方法也很简单,将连接数据库的字符集改成utf8mb4,且数据库、表、字段都需要修改为utf8mb4字符集,重要!!!
发生这个错误的原因是常见字符串占位3个字节,而emoji表情符号占用4个字节,utf8就不好使了,所以就得用utf8mb4字符集。
下面来根据指定条件来查询数据库(数据表文件获取口令0514):
with conn.cursor() as cursor:
# with代码管理器,可以省掉cursor.close和conn.close
sql = 'select id,title,area1,huxing,price from fang where area1=%s'
cursor.execute(sql,['武昌'])
# 还有执行多条sql和查询条件参数的,在后面进阶偏中来写
# rows = cursor.fetchall()
print('取一条:',cursor.fetchone())
print('获取10条记录:',cursor.fetchmany(10))
print('取一条:',cursor.fetchone())
# print(cursor.scroll(1, mode='absolute'))
# 指针按照绝对位置移动1
# print(cursor.scroll(1, mode='relative'))
# 指针按照相对位置移动1(相对当前位置)
# 这个地方的fetchall()获取所有记录,还可以有fetchone获取一条记录的,返回记录数
仔细测试下这里的三个获取查询结果的方法
fetchone:获取一条记录
fetchmany:获取指定条数记录
fetchall:获取所有记录
上面代码中,打印出来的结果是按照代码执行顺序来获取数据的,就是说,在调用fetchone的时候,指针会移动到下个位置。
增加单条记录:
with conn.cursor() as cursor:
sql1 = 'insert into spy(title,author,url,dt,ly) values(%s,%s,%s,%s,%s)'
# values里面有两种写法,一种是直接用%s占位符(没有%d),一种是带字段名%(name)s
row = cursor.execute(sql1,['test5','e','www.baidu.com','2019','loacl'])
# 批量插入多条数据,values用列表
conn.commit()
# 涉及修改数据库操作的,需要用commit提交事务
print(row)
print(cursor.lastrowid)
增加多条记录:
with conn.cursor() as cursor:
sql1 = 'insert into spy(title,author,url,dt,ly) values(%s,%s,%s,%s,%s)'
data = [
('test1','a','www.baidu.com','2019','loacl'),
('test2','b','www.baidu.com','2019','loacl'),
('test3','c','www.baidu.com','2019','loacl')
]
row = cursor.executemany(sql1,data)
# 批量插入多条数据,values用列表
conn.commit()
# 涉及修改数据库操作的,需要用commit提交事务
print(row)
单条记录和多条记录的区别主要一个是execute,一个是executemany
删除操作:
with conn.cursor() as cursor:
sql1 = 'delete from spy where author=%s'
row = cursor.execute(sql1,['e'])
conn.commit()
print(row)
# 打印结果是影响的记录数
修改操作:
with conn.cursor() as cursor:
sql1 = 'update spy set author=%s where ly=%s'
row = cursor.execute(sql1,['gary.w','loacl'])
conn.commit()
print(row)
# 打印结果是影响的记录数
数据回滚:
cursor = conn.cursor()
sql1 = 'insert into spy(title,author,url,dt,ly) values(%s,%s,%s,%s,%s)'
sql2 = 'insert into spy(id,title,author,url,ly) values(%s,%s,%s,%s,%s)'
try:
cursor.execute(sql1,['test6','匿名','www.vxinhao.com','2019','loacl'])
cursor.execute(sql2,['这里应该对应的是int的id','错误数据','www.baidu.com','2019','loacl'])
conn.commit()
except Exception as e:
print(str(e))
conn.rollback()
# 出现异常,执行回滚
finally:
cursor.close()
conn.close()
# 执行回滚后,数据不会被添加
这里做了个异常处理,看下异常处理的用法(模板):
try:
这里放执行数据库操作的代码块
except:
当上面的代码出现异常的时候执行的代码,这里用了rollback()方法
finally:
这里是一定会执行的代码,哪怕是前面出现错误
只要sql语句不会有什么问题,本文到这里,基本就够用了(节约时间)