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") # 相对于光标所在的位置继续往后移动1位 print(course.fetchall()) print(course.fetchone()) print(course.fetchone()) # 读取数据类似于文件光标的移动 course.scroll(1, "absolute") # 相当于数据的开头往后继续移动1位 print(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 ) 这样就增删改数据的时候就不需要二次确认了