首页 > 技术文章 > python操作mysql之pymysql

garyhtml 2022-01-28 20:13 原文

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()

推荐阅读