Python pymsql模块的使用


Posted in Python onSeptember 07, 2020

基本使用

首先要下载 pymysql

pip install pymsql

以下是 pymysql 的基本使用

import pymysql

# 链接,C/S架构,TCP链接
conn = pymysql.connect(
  host="localhost",
  database="db1",
  charset="utf8mb4", 
  user="root",
  cursorclass=pymysql.cursors.DictCursor, # 记录结果,字典显示
  # password = "your password",
  ) 

# 游标
cursor = conn.cursor()

# 执行sql
sql = "show tables"
res = cursor.execute(sql) # 提交执行,返回sql影响成功的行数

print(res) # 2 代表该数据库下有2个表
print(cursor.fetchall()) # [{'Tables_in_db1': 't1'}, {'Tables_in_db1': 't2'}]

cursor.close() # 关闭游标
conn.close()

游标概念

可以看到在上面的示例中有一个游标的概念,其实这个也非常简单,就等同于光标的上下移动,每移动一次代表一条记录。

Python pymsql模块的使用

pymsql 中,对于 select 等操作返回的结果都可以通过游标的移动配合相应方法函数来进行读取。

sql注入

如果你的某些 sql 语句要进行字符串拼接,那么一定要使用 pymysql 提供的 execute() 方法进行拼接,不要去用 python 中的 %format() 方法,这可能导致出现 sql 注入问题带来不安全的隐患。

注意:使用 execute() 时,不可传入表名,数据库名。否则会抛出语法错误,这是因为在拼接时会自动添加上``号

import pymysql

# 链接
conn = pymysql.connect(
  host="localhost",
  database="db1",
  charset="utf8mb4", 
  user="root",
  cursorclass=pymysql.cursors.DictCursor, # 记录结果,字典显示
  # password = "your password",
  ) 

# 游标
cursor=conn.cursor()

# 执行sql
sql = "select * from t1 where id=%s"
res = cursor.execute(sql,("1",)) # 提交执行,返回sql影响成功的行数 这里拼接能预防sql注入问题

print(res) # 1 查出一条记录
print(cursor.fetchall()) # 拿到所有记录的结果

cursor.close() # 关闭游标
conn.close()

事务提交

在执行 UPDATE/INSERT/DELETE 之类的操作,必须使用 conn.commit() 进行事务提交后方可生效。

或者你可以在实例化 conn 对象时为他指定 auto_commit 参数为 true 即可自动提交事务。

import pymysql

# 链接
conn = pymysql.connect(
  host="localhost",
  database="db1",
  charset="utf8mb4", 
  user="root",
  cursorclass=pymysql.cursors.DictCursor, # 记录结果,字典显示
  autocommit = True, # 自动提交
  # password = "your password",
  ) 

# 游标
cursor=conn.cursor()

# 执行sql
sql = "insert into t1(name) values(%s)"
res = cursor.execute(sql,("新记录",)) # 提交执行,返回sql影响成功的行数 这里拼接能预防sql注入问题

print(res) # 1 成功插入一条记录
print(cursor.lastrowid) #在插入语句后查看,查看最后一条记录的行号
print(cursor.fetchall())

# conn.commit() # 手动提交
cursor.close() # 关闭游标
conn.close()

提交多条

使用 cursor.executemany() 方法可一次性提交多条 sql 操作。

import pymysql

# 链接
conn = pymysql.connect(
  host="localhost",
  database="db1",
  charset="utf8mb4", 
  user="root",
  cursorclass=pymysql.cursors.DictCursor, # 记录结果,字典显示
  autocommit = True, # 自动提交
  # password = "your password",
  ) 

# 游标
cursor=conn.cursor()

# 执行sql
sql = "insert into t1(name) values(%s)" # 同一条命令,执行3次
res = cursor.executemany(sql,[("新记录1"),("新纪录2"),("新纪录3")]) # 提交执行,返回sql影响成功的行数 这里拼接能预防sql注入问题

print(res) # 3 成功插入三条记录
print(cursor.lastrowid) #在插入语句后查看,查看最后一条记录的行号
print(cursor.fetchall())

cursor.close() # 关闭游标
conn.close()

游标相关

获取到一条记录后,我们可以控制游标移动。

也可以控制查看游标后的多少条记录

游标每移动一次代表一条记录

命令解析 描述
cursor.scroll(3,mode='absolute') 游标以绝对位置向后移动3条记录
cursor.scroll(3,mode='relative') 游标以当前位置向后移动3条记录
注意:游标移动的条数即为记录的条数,如果移动值为负N就代表上N条记录

如果我们想获取记录,可使用以下三个方法

命令解析 描述
cursor.fetchone() 获取第一条记录,游标向下移动一行
cursor.fetchmany(2) 获取接下来的两条记录,游标向下移动两行
cursor.fetchall() 获取全部记录,游标移动到末尾,返回的是一个列表
import pymysql

# 链接
conn = pymysql.connect(
  host="localhost",
  database="db1",
  charset="utf8mb4", 
  user="root",
  cursorclass=pymysql.cursors.DictCursor, # 记录结果,字典显示
  autocommit = True, # 自动提交
  # password = "your password",
  ) 

# 游标
cursor=conn.cursor()

# 执行sql
sql = "select * from t1" # t1表中4条记录

cursor.execute(sql)

print(cursor.fetchone()) 游标移动到2的位置
cursor.scroll(2,mode='relative') 向下移动2,当前游标为4
print(cursor.fetchone())

cursor.close() # 关闭游标
conn.close()

"""

{'id': 1, 'name': '记录1'}
{'id': 4, 'name': '记录4'}

"""

插入行号

如果执行的是 INSERT 操作,可以在插入后查看最后插入的 ID 行号

import pymysql

# 链接
conn = pymysql.connect(
  host="localhost",
  database="db1",
  charset="utf8mb4", 
  user="root",
  cursorclass=pymysql.cursors.DictCursor, # 记录结果,字典显示
  autocommit = True, # 自动提交
  # password = "your password",
  ) 

# 游标
cursor=conn.cursor()

# 执行sql
sql = "insert into t1(name) values(%s)" # 同一条命令,执行3次
res = cursor.executemany(sql,[("新记录1"),("新纪录2"),("新纪录3")]) # 提交执行,返回sql影响成功的行数 这里拼接能预防sql注入问题

print(res) # 3 成功插入三条记录
print(cursor.lastrowid) #在插入语句后查看,查看最后一条记录的行号
print(cursor.fetchall())

# conn.commit() # 手动提交
cursor.close() # 关闭游标
conn.close()

以上就是Python pymsql模块的使用的详细内容,更多关于Python pymsql的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
在 Django/Flask 开发服务器上使用 HTTPS
Jul 03 Python
Python中使用PyQt把网页转换成PDF操作代码实例
Apr 23 Python
python通过自定义isnumber函数判断字符串是否为数字的方法
Apr 23 Python
Python的字典和列表的使用中一些需要注意的地方
Apr 24 Python
python实现本地图片转存并重命名的示例代码
Oct 27 Python
python实时获取外部程序输出结果的方法
Jan 12 Python
Python 中PyQt5 点击主窗口弹出另一个窗口的实现方法
Jul 04 Python
Python实现蒙特卡洛算法小实验过程详解
Jul 12 Python
python 列表、字典和集合的添加和删除操作
Dec 16 Python
python如何求数组连续最大和的示例代码
Feb 04 Python
python如何更新包
Jun 11 Python
python反编译教程之2048小游戏实例
Mar 03 Python
Python虚拟环境的创建和使用详解
Sep 07 #Python
python用Tkinter做自己的中文代码编辑器
Sep 07 #Python
利用Python将图片中扭曲矩形的复原
Sep 07 #Python
python利用递归方法实现求集合的幂集
Sep 07 #Python
Python描述数据结构学习之哈夫曼树篇
Sep 07 #Python
python简单利用字典破解zip文件口令
Sep 07 #Python
python 如何快速复制序列
Sep 07 #Python
You might like
php smarty 二级分类代码和模版循环例子
2011/06/01 PHP
CI(CodeIgniter)框架中的增删改查操作
2014/06/10 PHP
php类自动加载器实现方法
2015/07/28 PHP
jQuery 验证插件 Web前端设计模式(asp.net)
2010/10/17 Javascript
初学Jquery插件制作 在SageCRM的查询屏幕隐藏部分行的功能
2011/12/26 Javascript
根据json字符串生成Html的一种方式
2013/01/09 Javascript
js 得到文件后缀(通过正则实现)
2013/07/08 Javascript
Javascript:为input设置readOnly属性(示例讲解)
2013/12/25 Javascript
使用phantomjs进行网页抓取的实现代码
2014/09/29 Javascript
生成二维码方法汇总
2014/12/26 Javascript
jQuery+css3动画属性制作猎豹浏览器宽屏banner焦点图
2015/03/16 Javascript
JavaScript中的依赖注入详解
2015/03/18 Javascript
jQuery插件实现表格隔行变色及鼠标滑过高亮显示效果代码
2016/02/25 Javascript
JS中正则表达式只有3种匹配模式(没有单行模式)详解
2016/07/28 Javascript
基于JavaScript实现树形下拉框
2016/08/10 Javascript
AngularJS入门教程之路由与多视图详解
2016/08/19 Javascript
bootstrap suggest下拉框使用详解
2017/04/10 Javascript
详解如何让InstantClick兼容MathJax、百度统计等
2017/09/12 Javascript
VUE 3D轮播图封装实现方法
2018/07/03 Javascript
微信小程序实现跑马灯效果
2020/10/21 Javascript
JavaScript之Blob对象类型的具体使用方法
2019/11/29 Javascript
介绍Python中的fabs()方法的使用
2015/05/14 Python
[原创]Python入门教程3. 列表基本操作【定义、运算、常用函数】
2018/10/30 Python
局域网内python socket实现windows与linux间的消息传送
2019/04/19 Python
pytorch 常用线性函数详解
2020/01/15 Python
Python3.7黑帽编程之病毒篇(基础篇)
2020/02/04 Python
python列表删除和多重循环退出原理详解
2020/03/26 Python
Python常驻任务实现接收外界参数代码解析
2020/07/21 Python
Django vue前后端分离整合过程解析
2020/11/20 Python
HTML5拖拽文件上传的示例代码
2021/03/04 HTML / CSS
澳大利亚在线奢侈品时尚零售平台:Azura Runway
2021/01/13 全球购物
linux面试题参考答案(7)
2012/10/29 面试题
成龙洗发水广告词
2014/03/14 职场文书
小学教师教育随笔
2015/08/14 职场文书
高中语文教学反思范文
2016/02/16 职场文书
python turtle绘图命令及案例
2021/11/23 Python