pymysql模块
时间:2022-04-23
本文章向大家介绍pymysql模块,主要内容包括一、模块安装、二、链接、执行sql、关闭(游标)、三、execute()之sql注入、四、增、删、改:conn.commit()、五、查:fetchone,fetchmany,fetchall、六、获取插入的最后一条数据的自增ID、七、自定义sqlhelper!、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。
一、模块安装
#安装
pip3 install pymysql
二、链接、执行sql、关闭(游标)
import pymysql
user=input('用户名: ').strip()
pwd=input('密码: ').strip()
#链接
conn=pymysql.connect(host='localhost',user='root',password='123',database='egon',charset='utf8) #指定字符编码,可显示中文
#游标
cursor=conn.cursor()
#执行sql语句
sql='select * from userinfo where name="%s" and password="%s"' %(user,pwd) #注意%s需要加引号
print(sql)
res=cursor.execute(sql) #执行sql语句,返回sql查询成功的记录数目
print(res)
cursor.close()
conn.close()
if res:
print('登录成功')
else:
print('登录失败')
三、execute()之sql注入
注意:符号--会注释掉它之后的sql,正确的语法:--后至少有一个任意字符
根本原理:就根据程序的字符串拼接name='%s',我们输入一个xxx' -- haha,用我们输入的xxx加'在程序中拼接成一个判断条件name='xxx' -- haha'
最后那一个空格,在一条sql语句中如果遇到select * from t1 where id > 3 -- and name='egon';则--之后的条件被注释掉了
#1、sql注入之:用户存在,绕过密码
egon' -- 任意字符
#2、sql注入之:用户不存在,绕过用户与密码
xxx' or 1=1 -- 任意字符
解决方法:
# 原来是我们对sql进行字符串拼接
# sql="select * from userinfo where name='%s' and password='%s'" %(user,pwd)
# print(sql)
# res=cursor.execute(sql)
#改写为(execute帮我们做字符串拼接,我们无需且一定不能再为%s加引号了)
sql="select * from userinfo where name=%s and password=%s" #!!!注意%s需要去掉引号,因为pymysql会自动为我们加上
单条数据执行sql语句
cursor.execute(sql,[user,pwd]) #pymysql模块自动帮我们解决sql注入的问题,只要我们按照pymysql的规矩来。
四、增、删、改:conn.commit()
import pymysql
#链接
conn=pymysql.connect(host='localhost',user='root',password='123',database='egon')
#游标
cursor=conn.cursor()
#执行sql语句
#part1
# sql='insert into userinfo(name,password) values("root","123456");'
# res=cursor.execute(sql) #执行sql语句,返回sql影响成功的行数
# print(res)
#part2
# sql='insert into userinfo(name,password) values(%s,%s);'
# res=cursor.execute(sql,("root","123456")) #执行sql语句,返回sql影响成功的行数
# print(res)
#part3
sql='insert into userinfo(name,password) values(%s,%s);'
res=cursor.executemany(sql,[("root","123456"),("lhf","12356"),("eee","156")]) #执行sql语句,返回sql影响成功的行数
print(res)
conn.commit() #提交后才发现表中插入记录成功
cursor.close()
conn.close()
五、查:fetchone,fetchmany,fetchall
import pymysql
#链接
conn=pymysql.connect(host='localhost',user='root',password='123',database='egon',charset='utf8')
#游标
cursor=conn.cursor()
六、获取插入的最后一条数据的自增ID
import pymysql
conn=pymysql.connect(host='localhost',user='root',password='123',database='egon',charset='utf8)
cursor=conn.cursor()
sql='insert into userinfo(name,password) values("xxx","123");'
rows=cursor.execute(sql)
conn.commit()
print(cursor.lastrowid) #在commit之前和之后都可以查看
cursor.close()
conn.close()
七、自定义sqlhelper!
import pymysql
class SQLHelper(object):
def __init__(self):
self.conn = None
self.cursor = None
def open(self,cursor=pymysql.cursors.DictCursor):
self.conn = db_pool.POOL.connection()
self.cursor = self.conn.cursor(cursor=cursor)
def close(self):
self.cursor.close()
self.conn.close()
def fetchone(self,sql,params):
cursor = self.cursor
cursor.execute(sql,params)
result = cursor.fetchone()
return result
def fetchall(self, sql, params):
cursor = self.cursor
cursor.execute(sql, params)
result = cursor.fetchall()
return result
def create(self, sql, params):
cursor = self.cursor
cursor.execute(sql, params)
self.conn.commit()
return self.cursor.lastrowid
def delete(self, sql, params):
cursor = self.cursor
cursor.execute(sql, params)
self.conn.commit()
def update(self, sql, params):
cursor = self.cursor
cursor.execute(sql, params)
self.conn.commit()
def __enter__(self):
self.open()
return self
def __exit__(self, exc_type, exc_val, exc_tb):
self.close()
with SQLHelper() as helper:
result1 = helper.fetchone('select * from users where name=%s and pwd = %s',['hc',123,]) # 查单条记录
result2 = helper.fetchall('select * from users ',[]) #查所有记录
helper.create('insert into user (name,pwd) value(%s,%s)',['hc',123]) # 创建记录
定义函数时,设置参数默认值是注意, 默认参数不要传成可变数据类型
使用时
- 概率论11 协方差与相关系数
- Mybatis传多个参数(三种解决方案)
- 语义化HTML:i、b、em和strong标签
- JSON入门指南--服务端处理JSON
- 纸上谈兵: 图 (graph)
- 纸上谈兵: 拓扑排序
- MyBatis Generator自动创建代码
- Maven(六)之依赖管理
- 细说log4j
- SEVERE: Error configuring application listener of class org.springframework.web.context.ContextLoade
- TCP/IP(一)之开启计算机网络之路
- JSON入门指南--客户端处理JSON
- mysql5.7 ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
- TCP/IP中你不得不知的十大秘密
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- php实现 master-worker 守护多进程模式的实例代码
- Ubuntu 18.04 Server 设置静态IP 的办法
- PHP依赖注入容器知识点浅析
- centos克隆linux虚拟机的完整步骤分享
- laravel框架中间件简单使用方法示例
- PHP检查文件是否存在,不存在自动创建及读取文件内容操作示例
- Smarty模板语法详解
- PHP保留两位小数的几种方法
- PHP七种数据类型知识点总结
- PHP中__set()实例用法和基础讲解
- laravel框架分组控制器和分组路由实现方法示例
- 使用swoole 定时器变更超时未支付订单状态的解决方案
- Yii2 queue的队列使用详解
- ThinkPHP5+jQuery+MySql实现投票功能
- Smarty模板配置实例简析