从小白到小黑 python学习之旅 日常总结 48(navicat 补充练习 pymysql模块 )

navicat

Navicat内部封装了所有的操作数据库的命令
用户在使用它的时候只需要鼠标点点即可完成操作 无需书写sql语句

 

 官方下载:https://www.navicat.com.cn/download/navicat-premium  (或百度搜navicat)

 

下载完成后是一个压缩包 直接解压 然后点击安装 有提醒直接点击next即可

可以试用到期之后重新装再试用 

提示

navicat能够充当多个数据库的客户端

navicat图形化界面有时候反应速度较慢 你可以选择刷新或者关闭当前窗口再次打开即可

当你有一些需求该软件无法满足的时候 你就自己动手写sql
"""
1 MySQL是不区分大小写的
    验证码忽略大小写
        内部统一转大写或者小写比较即可
            upper
            lower

2 MySQL建议所有的关键字写大写

3 MySQL中的注释 有两种
    --
    #

4 在navicat中如何快速的注释和解注释
    ctrl + ?  加注释
    ctrl + ?  基于上述操作再来一次就是解开注释
    如果你的navicat版本不一致还有可能是
    ctrl + shift + ?解开注释
"""

 

补充练习

https://www.cnblogs.com/Its-cool/p/12846348.html

pymysql模块

"""
支持python代码操作数据库MySQL
"""
#安装
pip3 install pymysql

 

基本使用

import pymysql

# 链接数据库
conn = pymysql.connect(
    host = '127.0.0.1',
    port = 3306,  # 端口号
    user = 'root',
    password = '123456',
    database = 'day48',  # 库的名称
    charset = 'utf8'  # 编码千万不要加-
)
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)  # 产生一个游标对象(就是用来帮你执行命令的)
"""
cursor=pymysql.cursors.DictCursor将查询结果以字典的形式返回
"""
sql = 'select * from teacher;'
res = cursor.execute(sql)
# print(res)  # execute返回的是你当前sql语句所影响的行数  改返回值一般不用
# 获取命令执行的查询结果
# print(cursor.fetchone())  # 只拿一条
# print(cursor.fetchall())  # 拿所有
# print(cursor.fetchmany(2))  # 可以指定拿几条

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

 

 

通过MySQL的数据 登录账户

import pymysql
user=input('用户名: ').strip()
pwd=input('密码: ').strip()

#链接
conn=pymysql.connect(host='localhost',user='root',password='123',database='egon',charset='utf8')
#游标
cursor=conn.cursor() #执行完毕返回的结果集默认以元组显示
#cursor=conn.cursor(cursor=pymysql.cursors.DictCursor)


#执行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会自动为我们加上  # 不要手动拼接数据 先用%s占位 之后将需要拼接的数据直接交给execute方法即可

res=cursor.execute(sql,[user,pwd])  # 自动识别sql里面的%s用后面元组里面的数据替换#pymysql模块自动帮我们解决sql注入的问题,只要我们按照pymysql的规矩来。 

 

posted @ 2020-05-07 22:29  It's_cool  阅读(190)  评论(0)    收藏  举报