Python操作MySQL
我们想要在Pycharm里面操作MySQL需要安装一个模块 pymysql模块
如果没有下载cmd中 pip install pymysql 或者直接pycharm中 import pymysql 点击小灯安装即可
import pymysql
conn = pymysql.connect(host='127.0.0.1',
port=3306, user='root',
password='123', database='likes',
charset='utf8mb4', autocommit=True) # 链接服务器
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) # 产生一个游标对象(等待输入 相当于光标处等待输入)
# 注意括号内内容没有写全 cursor=pymysql.cursors.DictCursor 则结果不会显示表格的信息名称
sql1 = 'select * from dep1' # 编写SQL语句
cursor.execute(sql1) # 发送给服务器
res = cursor.fetchall() # 获取命令的执行结果
print(res)
cursor.fetchall() # 获取结果中所有的数据
cursor.fetchone() # 获取结果中一条数据
cursor.fetchmany() # 获取结果集中指定的数据(括号内写入数字几获得几条数据)
cursor 类似于光标 第一次获取完 再次获取的消息就丢失了 基于当前位置往后移动
'''pycharm 里面写入SQL语句会飘黄 不用在意'''
SQL注入问题
先用SQL语言编写一个用户登录
import pymysql
conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', password='123', database='likes',
charset='utf8mb4', autocommit=True) # 链接服务器
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
username = input('请输入您的账号:>>>>:').strip()
password = input('请输入您的密码:>>>>:').strip()
sql = "select * from new where name='%s' and pwd='%s'" % (username, password)
cursor.execute(sql)
res = cursor.fetchall()
# print(res) # 如果成功打印结果
if res:
print('登录成功')
else:
print('用户名或密码错误')
这个时候我们发现可以登录成功了 这么轻松吗?
这才开始 !!! 为什么输入没输入密码就登录成功了
select * from new where name='xxx' or 1=1 -- asdadqdqdw' and pwd=''
select * from new where name='like' -- asdqdqdq1d1' and pwd=''
我们发现是我们在输入SQL语句的时候 达到了注释语法把后面给注释掉了 只有用户名是对的 就对了
第一个是where后面结果如果是TRUE的话 那就算对
所以SQL注入的本质就是
利用一些特殊符号的组合产生了特殊的含义从而逃脱了正常的业务逻辑
措施就是 针对用户输入的数据不能输入符号什么的 这就是为什么很多网站账号不允许输入特殊符号的原因 所以
用户输入的数据不要自己处理 交给专门的方法自动过滤
sql = "select * from new where name=%s and pwd=%s"
cursor.execute(sql, (username, password)) # pymysql会自动识别%s 并自动过滤各种符合 最后合并数据
知识点补充
cousor.executemany()
它的用法我们也知道就是一次性插入多行数据
import pymysql
conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', password='123', database='likes',
charset='utf8mb4', autocommit=True) # 链接服务器
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
sql = 'insert into new(name,pwd) values(%s,%s)'
cursor.executemany(sql, [('jack', 123), ('lebron', 123), ('lisa', 123)])
as语法 给字段起别名、起表名 (为了见名知意)
select name as '名称' from new; # name后面跟上as 输入新的名称即可
comment语法 # 给表、字段添加注释信息
create table server(id int) comment '这个server意思是服务器表'
create table t1(
id int comment '用户编号',
name varchar(16) comment '用户名'
) comment '用户表';
'''
两个可以查询注释的地方
show create table 表名
use information_schema 默认没有权限直接查看
'''
concat、concat_ws语法
concat用于分组之前多个字段数据的拼接
concat_ws如果有多个字段 并且分隔符一致 可以使用该方法减少代码
select concat(name,pwd) from new;
select concat_ws('|',name,pwd) from new;
exists语法
exists后面的sql语句如果有结果那么执行前面的sql语句 如果后面没有结果则不执行
select * from emp1 where exists (select * from emp where id < 10);
技术小白记录学习过程,有错误或不解的地方请指出,如果这篇文章对你有所帮助请
点点赞收藏+关注
谢谢支持 !!!