python操作mysql之pymysql
准备工作:
下载固定模块:
方法一:命令下载 pip3 isntall pymysql
方法二:借助于pycharm
模块的基本使用
import pymysql # 导入模块
# 创建链接
conn = pymysql.connect(
host='127.0.0.1', # 本地回环地址
port=3306, # mysql固定端口好3306
user='root', # 用户名
password='123', # 密码
database='db5', # 必须指定库
charset='utf8' # 注意这里不可以写utf-8
)
# 生成一个游标对象(相当于cmd下的打开mysql的命令界面 mysql> )
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) # 括号内的命令是让数据自动组织成字典
# 定义sql语句
sql = 'select * from user'
# 执行sql语句
cursor.execute(sql)
# 获取返回结果
res = cursor.fetchall()
print(res)
sql注入问题
在讲解什么是sql注入问题之前我们来看一个现象:
# 使用数据库写一个简单的用户注册登录:
import pymysql
# 创建链接
conn = pymysql.connect(
host='127.0.0.1', # 本地回环地址
port=3306, # mysql固定端口好3306
user='root', # 用户名
password='123', # 密码
database='db5', # 必须指定库
charset='utf8' # 注意这里不可以写utf-8
)
# 生成一个游标对象(相当于cmd下的打开mysql的命令界面 mysql> )
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
username = input('用户名:').strip()
password = input('密码:').strip()
sql = "select * from user where user ='%s' and password='%s'"%(username,password)
print(sql)
cursor.execute(sql)
res = cursor.fetchall()
if res:
print('登陆成功')
else:
print('用户名或密码错误')
验证是没有问题的,但是我们来看一个现象:
# 我们观察上述问题:
问题1
用户名正确 不需要密码也能登录
问题2
用户名和密码都不需要也能登录
这就是sql注入问题:
SQL注入问题的产生:
就是通过一些特殊符号的组合 达到某些特定的效果从而避免常规的逻辑
SQL注入问题如何解决:
execute方法自动帮你解决
演示execute方法:
import pymysql
# 创建链接
conn = pymysql.connect(
host='127.0.0.1', # 本地回环地址
port=3306, # mysql固定端口好3306
user='root', # 用户名
password='123', # 密码
database='db5', # 必须指定库
charset='utf8' # 注意这里不可以写utf-8
)
# 生成一个游标对象(相当于cmd下的打开mysql的命令界面 mysql> )
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
# 获取用户名和密码
username = input('用户名:').strip()
password = input('密码:').strip()
# 构建sql语句
# sql = "select * from user where user ='%s' and password='%s'"%(username,password)
sql = "select * from user where user =%s and password=%s"
print(sql)
cursor.execute(sql,(username,password)) # 使用execute
res = cursor.fetchall()
if res:
print(res)
print('登陆成功')
else:
print('用户名或密码错误')
这里就解决了sql注入的问题 只需要用到固定的方法execute即可
pymysql autocommit自动二次确认
autocommit二次确认:设计到增删改都需要二次确认 autocommit就解决了手动二次确认,在设计增删改查时默认二次确认的效果。
那么接下来我们来看一下为什么需要二次确认,二次确认到底时为了实现什么呢?
import pymysql
# 创建链接
conn = pymysql.connect(
host='127.0.0.1', # 本地回环地址
port=3306, # mysql固定端口好3306
user='root', # 用户名
password='123', # 密码
database='db5', # 必须指定库
charset='utf8' # 注意这里不可以写utf-8
)
# 生成一个游标对象
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) # 让数据自动组织成字典
sql1 = 'select * from user' # 查看数据
sql2 = 'insert into user(user ,password) values(%s,%s)' # 插入数据
sql3 = 'update user set user =tom22 where id=2' # 修改数据
sql4 = 'delete from user where id=2' # 删除数据
1、查询数据结果:
cursor.execute(sql1)
print(cursor.fetchall())
2、插入数据结果:
cursor.execute(sql2,('haha',123123)) # 插入数据就无需返回结果了
3、修改数据结果:
res = cursor.execute(sql3) # 执行sql3将tom改为tom22 # cursor的返回结果为影响了几行
print(res)
4、删除表数据
总结:
# 1.查询语句可以正常执行并获取结果
# cursor.execute(sql1)
# 2.插入语句能够执行 但是并没有影响表数据
# cursor.execute(sql2,('jackson',666))
# 3.更新语句能够执行 但是并没有影响表数据
# res = cursor.execute(sql3)
# print(res)
# 4.删除语句能够执行 但是并没有影响表数据
# res = cursor.execute(sql4)
# print(res)
解释:在针对增删改查操作时他们的重要程度不一样(级别不一样) 查功能的级别是最低的,增删改都是要影响到数据信息的,pymysql规定必须需要一个二次确认才可生效。
怎么进行二次确认呢?
关键字:commit()
在执行增删改操作的下面 执行 conn.commit()命令进行二次确认
# 验证:
解决手动添加二次确认问题:
# 这样感觉每次执行增删改操作都要执行conn.commit()命令非常的麻烦.
这里就用到我们开头提到的自动二次确认 autocommit :
使用:
在创建pymysql添加: autocommit=True
补充 executemany():
定义: 在我们要插入很多数据的时候 就要使用到executemany()
使用:
cursor.executemany(sql2,[('tom',111),('toom',222),('tooom',333)])
验证:
补充:
主动关闭连接 释放资源(用在代码块最后): conn.close()