ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

python操作mysql之pymysql

2022-01-28 20:34:07  阅读:385  来源: 互联网

标签:execute python mysql pymysql cursor user sql password


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

标签:execute,python,mysql,pymysql,cursor,user,sql,password
来源: https://www.cnblogs.com/jjjmhf50/p/15853693.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有