1.Navicat作用
Navicat图形界面可以直观、简化管理数据库数据,用来充当MySQL、MariaDB、SQL Server、Oracle、PostgreSQL和SQLite的客户端,最主要用于MySQL
2.下载与安装
官方下载地址:https://navicat.com.cn/
3.主要功能
链接服务器:
双击查看表格:
创建表格:
ps:所有关于SQL语句的操作都可以通过Navicat可视化简单的操作。
1.pymysql模块的作用
在python3.x中,可以使用pymysql来连接MySQL数据库,pymysql还包含了 pure-Python MySQL 客户端库,并实现数据库的各种操作;Python2中则使用mysqldb
2.安装pymysql模块
因为是第三方模块所以在使用前要先将pymysql模块进行安装,下面是通过pip的方式进行安装当然安装第三方模块的方法也有很多详情参考:第三方模块安装
pip install PyMySQL3.链接服务端
在链接数据库前得先创建好数据库、表及数据
import pymysql conn = pymysql.connect( host = 'localhost', # 服务器地址 port = 3306 , # 端口号 user = 'root', # 访问用户 password = '123', # 用户密码 database = 'db', # 数据库 charset = 'utf8mb4' # 数据类型 autocommit = True # 执行增、改、删操作时自动执行conn.commit ); # 产生一个游标对象 cursor = conn.cursor(cursor = pymysql.cursors.DictCursor) # 编写SQL语句 sql1 = ‘select * from userinfo' # 执行SQL语句 cursor.execute(sql1) # 获取执行完的所有数据 data = cursor.fetchall() # 打印获取数据 print(data) #关闭游标和数据库的连接 cursor.close() conn.close()4.pymysql对表的增、改、删操作
pymysql对表操作时只需把SQL语句进行变换编写就可以
import pymysql conn = pymysql.connect( host='localhost', port=3306, user='root', password='12345678', database='db', charset='utf8mb4', autocommit=True ) cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) # 查看user表内的所以数据 sql1 = 'select * from user' # 增加数据 sql2 = 'insert into user(name,gender,age) values("Annle","male",18)' # 修改表数据 sql3 = 'update user set age = 88 where id=2' # 删除表 sql4 = 'delete from user' # 发送给服务端 cursor.execute(sql1) # 获取执行的结果 data = cursor.fetchall() print(data) cursor.close() conn.close()5.获取查询数据
查询数据后可以根据需要的数据选择不同的语句
import pymysql conn = pymysql.connect( host='localhost', port=3306, user='root', password='12345678', database='db', charset='utf8mb4', autocommit=True ) cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) # 查看user表内的所以数据 sql1 = 'select * from user' cursor.execute(sql1) data = cursor.fetchall() # 获取结果集所以数据 print(data) data1 = cursor.fetchone() # 获取结果集中一条数据 print(data1) data2 = cursor.fetchmany(2) # 获取结果集中指定条的数据 print(data2) data3 = cursor.scroll(2,mode='relative') # 获取基于当前位置往后移动 print(data3) data4 = cursor.scroll(2,mode='absolute') # 获取数据集开头的位置往后移 print(data4) cursor.close() conn.close()6.SQL注入问题
本质就是利用一些特殊含义的符号组成了含义特殊意思的语句从而改变了代码原本的执行逻辑
发现问题:
import pymysql conn = pymysql.connect( host='localhost', port=3306, user='root', password='12345678', database='db', charset='utf8mb4', autocommit=True ) cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) username = input('username>>>:').strip() password = input('password>>>:').strip() # 4.编写SQL语句 sql = "select * from user where name='%s' and pwd='%s'"%(username,password) cursor.execute(sql) res = cursor.fetchall() if res: print('登录成功') print(res) else: print('用户名或密码')∙ 当编写基于数据库登陆用户时发现当输入 xxx or 1=1 或 用户名 -- 乱码 时依然返回登陆成功,此时根据还原sql语句发现:
select * from user where name=‘aa’ -- ndjkcndj and pwd=‘123’ '''--在SQL语句中是注释 所以将--后面的语句全部注释了''' select * from user where name=‘aa’ and pwd=dsdsv or 1=1 '''or 在关系运算中表示一个成立即可而1=1恒成立'''解决注入问题:
execute模块也可以识别%s并过滤特殊符号会自动将数据传入
import pymysql conn = pymysql.connect( host='localhost', port=3306, user='root', password='12345678', database='db', charset='utf8mb4', autocommit=True ) cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) username = input('username>>>:').strip() password = input('password>>>:').strip() # 4.编写SQL语句 sql = "select * from user where name=%s and pwd=%s" cursor.execute(sql,(username,password)) res = cursor.fetchall() if res: print('登录成功') print(res) else: print('用户名或密码')