目录
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 '用户表';