第34天 Navicat软件使用 pymysql模块的使用 注入问题的产生原因与解决办法 pymysql文件的增删改查

Navicat软件

一开始学习python的时候 下载python解释器然后直接在终端写python代码
pycharm能够更加方便快捷的帮助你书写代码
excel word pdf

我们在终端操作mysql 也没有自动提示也无法保存等等 不方便开发
Navicat内部封装了所有的操作数据库的命令
用户在使用它的时候只需要鼠标点点即可完成操作 无需书写sql语句

安装
    直接百度搜索 有破解版的也有非破解版
        下载完成后是一个压缩包 直接解压 然后点击安装即可
        
    navicat能够充当多个数据库的客户端
    
    navicat图形化界面有时候反应速度较慢 你可以选择刷新或者关闭当前窗口再次打开即可
        
    当你有一些需求该软件无法满足的时候 你就自己动手写sql
    
提示
    1 mysql是不区分大小写的 
        忽略大小写
            验证码忽略大小写
                内部统一转大写或者小写比较即可
                upper
                lower
    
    2 mysql建议所有的关键字写大写
    
    3 mysql中的注释有两种
        --
        #
        
    4 在navicat中如何快速的注释和解注释
        ctrl + ?
        ctrl + ? 基于上述操作再来一次就是揭开注释
        如果你的navicat版本不一致还有可能是
        ctrl + shift +

pymysql模块

支持python代码操作库mysql
安装命令:
pip3 install pymysql


import pymysql

conn = pymysql.connect(
    host="127.0.0.1",
    port=3306,
    user="root",
    password="123",
    database="test2",  # 指定操作的库
    charset="utf8",  # 编码千万不要写成“utf-8”,会直接报错的
)  # 链接数据库

course = conn.cursor(cursor=pymysql.cursors.DictCursor)  # 产生一个游标对象(就是等待输入命令的地方,帮你执行命令的)
# 如果course = conn.cursor() 括号里面不加参数,那么查询出来的数据是以元组的形式,数据不够明确,容易混乱
# cursor=pymysql.cursors.DictCursor将查询结果以字典的形式返回
sql = "select * from emp1;"
res = course.execute(sql)     # res是该查询语句的返回结果
print(res)  # execute 返回的是你当前sql语句所影响的行数,该返回值一般不用
# 获取命令执行的查询结果
print(course.fetchone())  # 只拿一条
print(course.fetchall())  # 拿所有
print(course.fetchmany(2))  # 括号里面传参可以指定拿几条数据

print(course.fetchone())
print(course.fetchone())  # 读取数据类似于文件光标的移动
course.scroll(1, "relative")  # 相对于光标所在的位置继续往后移动1print(course.fetchall())


print(course.fetchone())
print(course.fetchone())  # 读取数据类似于文件光标的移动
course.scroll(1, "absolute")    # 相当于数据的开头往后继续移动1print(course.fetchall())

sql注入
注入问题
利用一些语法的特性 书写一些特定的语句实现固定的语法
mysql利用的是mysql --的注释语法

select * from user where username ='nana' -- 
snwmoemodmeo' and password = ''

select * from user where username ='ssss' or True -- 
smmmms' and password = ''
import pymysql

conn = pymysql.connect(
    host="127.0.0.1",
    port=3306,
    user="root",
    password="123",
    database="test2",
    charset="utf8"
)
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)

username = input("username>>>:").strip()
password = input("password>>>:").strip()
sql = "select * from user where username ='%s' and password = '%s'" % (username, password)
print(sql)
rows = cursor.execute(sql)
if rows:
    print("登陆成功")
    print(cursor.fetchall())
else:
    print("用户名密码错误")
sql语句:
select * from user where username ='nana' -- snwmoemodmeo' and password = ''
select * from user where username ='ssss' or True -- smmmms' and password = ''

注入问题的解决方法
日常生活中很多软件在注册的时候都不能含有特殊符号
因为怕你构造出特定的语句入侵数据库,不安全

敏感的数据不要自己做拼接,交给execute帮你拼接即可

import pymysql

conn = pymysql.connect(
    host="127.0.0.1",
    port=3306,
    user="root",
    password="123",
    database="test2",
    charset="utf8"
)
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)

username = input("username>>>:").strip()
password = input("password>>>:").strip()
sql = "select * from user where username =%s and password = %s"
# 不要手动拼接数,先用%s占位,之后将需要拼接的数据直接交给execute方法即可
print(sql)
rows = cursor.execute(sql, (username, password))  # 自动识别sql里面的%s然后用后面元组里面的数据替换,并且会帮你把特殊符号自动过滤掉
if rows:
    print("登陆成功")
    print(cursor.fetchall())
else:
    print("用户名密码错误")

pymysql文件的增删改查

方法一:

增删改查中 
    增删改的操作 涉及到数据的修改
    需要二次确认才能真正的操作数据 conn.commit() 

# 增
sql = "insert into user(username,password) values(%s,%s)"
rows = cursor.execute(sql, ("lala", 123))
print(rows)     # 返回的rows表示影响到的行数,值为1
conn.commit()   # 确认

# 一次性增加多条数据
sql = "insert into user(username,password) values(%s,%s)"
rows = cursor.executemany(sql, [("xxx", 123), ("ooo", 123), ("yyy", 123)])
print(rows)     # 返回的rows表示影响到的行数,值为1
conn.commit()   # 确认

# 修改
sql = "update user set username = 'bb' where id = 5"
rows = cursor.execute(sql)
print(rows)       # 返回的rows表示影响到的行数,值为1
conn.commit()     # 确认

# 删除
sql = "delete from user where id = 5"
rows = cursor.execute(sql)
print(rows)       # 返回的rows表示影响到的行数,值为1
conn.commit()     # 确认

# 查
sql = "select * from user"
cursor.execute(sql)
print(cursor.fetchall())	# 查是可以直接显示打印结果的,不需要二次确认

方法二:

    或者在链接数据库的时候,
    在conn=pymysql.connect(
        host="127.0.0.1",
        port=3306,
        user="root",
        password="123",
        db="test2",
        charset="utf8",
        autocommit=True
    )   这样就增删改数据的时候就不需要二次确认了


猜你喜欢

转载自blog.csdn.net/Yosigo_/article/details/113997030