首页 » 产品日记 » 正文

python模块pymysql

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语句不会有什么问题,本文到这里,基本就够用了


首发地址:https://www.jianshu.com/p/90fdf0ba8597

发表评论