Python pymsql模块的使用
作者:云崖先生 发布时间:2023-01-08 15:23:00
标签:Python,pymsql
基本使用
首先要下载 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()
游标概念
可以看到在上面的示例中有一个游标的概念,其实这个也非常简单,就等同于光标的上下移动,每移动一次代表一条记录。
在 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()
来源:https://www.tuicool.com/articles/RN7zAzJ


猜你喜欢
- 一、logging模块讲解1.函数:logging.basicConfig()参数讲解:(1)level代表高于或者等于这个值时,那么我们才
- 直接开始,过程中对每一步可能出现的错误都进行了说明。1、安装好xampp,然后打开终端,输入:mysql -u root -p成功进入了,擦
- 在后台处理数据时,前台页面同时计数显示进度条Proess Bar使用了layer来显示用法:1。引用<script lang
- 简单的‘Hello World!'Python命令行假设你已经安装好了Python, 那么在Linux命令行输入:$python将直
- 方式一、使用localStorage在数据存储1、要在浏览器刷新的时候重新存储起来if (window.localStorage.getIt
- 在了解了JavaScript1.7的相关更新后,我们再继续关注JavaScript1.8的新特性。在W3C Group带来的JavaScri
- 一、类和对象Python属于动态类型的语言,而动态语言和静态语言最大的不同,就是函数和类的定义,不是编译时创建的,而是运行时动态创建的,比方
- 今年年初之时,微软发布了一个针对ActiveX控件的补丁,安装此补丁后的IE6中,当ActiveX控件获得焦点时,IE自动为其套上一个虚线矩
- 简介mysql的innodb引擎查询记录时在无法使用索引覆盖的场景下,需要做回表操作获取记录的所需字段。mysql执行sql前会执行sql优
- 第一种情况:有RAID,还需要做数据库备份吗?回答:需要。有了RAID,万一部份磁盘损坏,可以修复数据库,有的情况下数据库甚至可以继续使用。
- 最近一个项目中遇到ASP对FoxPro库表(*.DBF)的操作问题。现实中确有许多应用软件使
- 当今互联网时代,数据处理已经成为了一个非常重要的任务。而Redis作为一款高性能的NoSQL数据库,越来越受到了广大开发者的喜爱。本篇博客将
- 1,CSS,JS,IMG一个都不能少运行代码框<style type="text/css">&l
- 需要使用到的文件wxapp.py, read_file.py, setup.py#!/usr/bin/env python# -*- cod
- 使用说明:1. 将PHP.INI文件里面的"extension=php_gd2.dll"一行前面的;号去掉,因为我们要用
- 即使你没听说过“ * 六度分隔理论”,也很可能听过“凯文 • 贝肯 (Kevin Bacon)的六度分隔值游戏”。在这两个游戏中,目标都是
- 在缺失值填补上如果用前后的均值填补中间的均值,比如,0,空,1,我们希望中间填充0.5;或者0,空,空,1,我们希望中间填充0.33,0.6
- 一、基本结构语句一)、条件语句age = int(input("请输入你家狗狗的年龄: "))print("&
- 本文实例为大家分享了Django文件上传与下载的具体代码,供大家参考,具体内容如下文件上传1.新建django项目,创建应用stu: pyt
- 本文实例讲述了PHP函数shuffle()取数组若干个随机元素的方法。分享给大家供大家参考,具体如下:有时候我们需要取数组中若干个随机元素(