MySQL可视化,python操作mysql,多表查询

本文介绍了如何使用Navicat Premium作为MySQL的可视化管理工具,讲解了Python通过pymysql模块操作MySQL数据库的方法,强调了SQL注入问题及其防范,并提供了多表查询的实例和解决方案。
摘要由CSDN通过智能技术生成

目录

python 操作mysql

获取结果

SQL注入问题

多表查询练习题


navicat 可视化软件

Navicat Premium 是一套数据库管理工具,结合了其它 Navicat 成员的功能,支持单一程序同時连接到 MySQL、MariaDB、SQL Server、SQLite、Oracle 和 PostgreSQL数据库。Navicat Premium 可满足现今数据库管理系统的使用功能,包括存储过程、事件、触发器、函数、视图等。

Navicat Premium 支持快速地在各种数据库系统间传输数据,传输指定SQL格式以及编码的纯文本文件。执行不同数据库的批处理作业并在指定的时间运行。其他功能包括导入向导、导出向导、查询创建工具、报表创建工具、数据同步、备份、工作计划及更多。Navicat 的功能不仅符合专业开发人员的所有需求,对数据库服务器的新手来说学习起来也相当容易。

下载地址: Navicat | 支持 MySQL、MariaDB、MongoDB、SQL Server、SQLite、Oracle 和 PostgreSQL 的数据库管理

python操作MySQL

python操作MySQL要经过第三方模块>>> pymysql

先下载第三方模块  >>>>  pip3 install pymysql

import pymysql

# 1.连接服务端
conn = pymysql.connect(
    user='root',
    password='123',
    host='127.0.0.1',
    port=3306,
    database='classinfo',
    charset='utf8mb4',
    autocommit=True  # 执行增改删操作自动执行conn.commit()
)

# 产生一个游标对象
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)

# 编写sql语句
sql1 = "SELECT course.cname,teacher.tname FROM course INNER JOIN teacher ON course.teacher_id = teacher.tid;"

# 发送给服务端 执行SQL语句
cursor.execute(sql1)

# 获取命令的执行结果
res = cursor.fetchall()

print(res)
# [{'cname': '生物', 'tname': '张磊老师'}, 
# {'cname': '物理', 'tname': '李平老师'},
# {'cname': '体育', 'tname': '刘海燕老师'},
# {'cname': '美术', 'tname': '李平老师'}]

获取结果

cursor.fetchone()     # 获取结果集中的一条数据

cursor.fetchall()      #  获取结果集中的所有数据

cursor.fetchmany(n)  #   获取结果集中指定条的数据

# 类似于光标的概念

cursor.scroll(2,mode = ;relative')   #  基于当前位置向后移动

cursor.scroll(0,mode='absoulte')    #  基于数据集开头的位置向后移动

SQL注入问题

SQL注入问题的本质是利用一些特殊的符号组合产生了特殊的含义,使得不用用户名和密码就能直接登录账号,从而逃脱了正常的业务逻辑. 对于数据隐私安全很不友好,

import pymysql

conn = pymysql.connect(
    user='root',
    password='123',
    host='127.0.0.1',
    port=3306,
    database='db4',
    charset='utf8mb4',
    autocommit=True
)

cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)

username = input('username>>>:').strip()
password = input('password>>>:').strip()

# 针对用户输入数据 不要自己处理 交给专门的方法过滤
sql = f"select * from user_info where  name=%s and password=%s"

cursor.execute(sql, (username, password))  # 自动识别并过滤

res = cursor.fetchall()
if res:
    print('登录成功')
else:
    print('账号或密码错误')

1.    select * from userinfo where name='jason' -- haha' and pwd=''
 2.   select * from userinfo where name='xyz' or 1=1  -- heihei' and pwd=''

第一种情况是由于-- 语法注释导致的

        MySQL的语法注释有三种: 

  • 从一个 # 到行末。

  • 从两个连续横杠 --  序列到行尾。 在MySQL中, - (两个连续横杠 )注释样式要求第二个破折号后跟至少一个空格或控制字符(例如空格,制表符,换行符等)。 此语法与标准SQL注释语法略有不同。

  • 从一个 /* 顺序到下一个* /结束, 此语法使注释能够扩展到多行,因为开始和结束序列不必位于同一行。

第二种情况是由于 1= 1 恒成立

MySQL有专门针对用户输入数据的过滤措施, 所以也无须过多担心

 sql = "select * from userinfo where name=%s and pwd=%s"
    cursor.execute(sql, (username, password))  # 自动识别%s 并自动过滤各种符合 最后合并数据
补充
	 cursor.executemany()

comment语法

给表, 字段添加注释信息

	create table server(id int) comment '这个server意思是服务器表'
	create table t1(
    	id int comment '用户编号',
       name varchar(16) comment '用户名'
    ) comment '用户表';
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值