8.22MySQL(五)pymysql模块、sql注入问题

一、基本查询语句及方法补充

1.concat_ws

  拼接多个

  select concat(name,":",age,":",post,":",salary) from emp;

  select concat_ws(':',name,age,post,salary) from emp;

  上述语句完全等价

2.exist(了解)

  EXISTS关字键字表示存在。

  在使用EXISTS关键字时,内层查询语句不返回查询的记录,而是返回一个真假值,True或False。

  当返回True时,外层查询语句将进行查询

  当返回值为False时,外层查询语句不进行查询。

select * from emp
    where exists
    (select id from dep where id > 3);

select * from emp
    where exists
    (select id from dep where id > 250);

二、pymysql模块

1.安装:pip3 insatll pymysql

2.代码连接

import pymysql

conn = pymysql.connect(
    host = '127.0.0.1',
    port = 3306,
    user = 'root',
    password = '123',
    database = 'day38',
    charset = 'utf8'  # 编码千万不要加-,如果写成了utf-8会直接报错
)
cursor = conn.cursor(pymysql.cursors.DictCursor)  # 产生一个游标对象,以字典的形式返回查询出来的数据,键是表的字段,值是表的字段对应的信息
sql = 'select * from teacher'
res = cursor.execute(sql)  # 执行传入的sql语句
print(res)  # res是执行语句返回的数据条数

print(cursor.fetchone())  # 只获取一条数据
print(cursor.fetchall())  # 获取所有的数据,返回的结果是一个列表

cursor.scroll(1,'absolute')  # 控制光标移动,absolute相对于起始位置,往后移动几位
cursor.scroll(1,'relative')  # relative相对于当前位置,往后移动几位

三、sql注入问题

1.注入问题,错误代码

import pymysql

conn = pymysql.connect(
    host = '127.0.0.1',
    port = 3306,
    user = 'root',
    password = '123',
    database = 'day38',
    charset = 'utf8'  # 编码千万不要加-,如果写成了utf-8会直接报错
)
cursor = conn.cursor(pymysql.cursors.DictCursor)  # 产生一个游标对象,以字典的形式返回查询出来的数据,键是表的字段,值是表的字段对应的信息

username = input(">>>:").strip()
password = input(">>>:").strip()
sql = "select * from user where username='%s' and password='%s'"%(username,password)
res = cursor.execute(sql)  # 传入执行的语句

# 用户名正确
username >>>: jason' -- jjsakfjjdkjjkjs
password >>>: ''

# 用户名密码都不对的情况
username >>>: xxx' or 1=1 --asdjkdklqwjdjkjasdljad
password >>>: ''

  sql注入问题,就是利用注释等具有特殊意义的符号,来完成一些骚操作

  后续写sql语句,不要手动拼接关键性的数据

  而是让excute帮你去做拼接

2.excute,正确代码

import pymysql

conn = pymysql.connect(
    host = '127.0.0.1',
    port = 3306,
    user = 'root',
    password = '123',
    database = 'day38',
    charset = 'utf8'  # 编码千万不要加-,如果写成了utf-8会直接报错
)
cursor = conn.cursor(pymysql.cursors.DictCursor)  # 产生一个游标对象,以字典的形式返回查询出来的数据,键是表的字段,值是表的字段对应的信息

username = input(">>>:").strip()
password = input(">>>:").strip()
sql = "select * from user where name =%s and password = %s"
res = cursor.execute(sql,(username,password))  # 能够帮你自动过滤特殊符号,避免sql注入的问题
# execute能够自动识别sql语句中的%s,帮你做替换
if res:
    print(cursor.fetchall())
else:
    print('用户名或密码错误')

四、pymysql增删改

1.增删改(以下增删改操作都不生效)

  先代码连接

import pymysql

conn = pymysql.connect(
    host = '127.0.0.1',
    port = 3306,
    user = 'root',
    password = '123',
    database = 'day38',
    charset = 'utf8'  # 编码千万不要加-,如果写成了utf-8会直接报错
)
cursor = conn.cursor(pymysql.cursors.DictCursor)  # 产生一个游标对象,以字典的形式返回查询出来的数据,键是表的字段,值是表的字段对应的信息

  新增

sql = 'insert into user(name,password) values("jerry","666")'
cursor.execute(sql)

  修改

sql = 'update user set name = "jasonhs" where id = 1'
cursor.execute(sql)

  删除

sql = 'delete from user where id = 6'
cursor.execute(sql)

  以上增删改操作都不生效

2.conn.commit()

  增、改和删操作只执行excute并不会真正影响到数据,需要再执行conn.commit()才可以完成真正的增改

1.增删改操作正确写法

# 新增
sql = 'insert into user(name,password) values("jerry","666")'
cursor.execute(sql)
conn.commit()

# 修改
sql = 'update user set name = "jasonhs" where id = 1'
cursor.execute(sql)
conn.commit()

# 删除
sql = 'delete from user where id = 6'
cursor.execute(sql)
conn.commit()

2.也可以在连接的时候多配一个参数

import pymysql

conn = pymysql.connect(
    host = '127.0.0.1',
    port = 3306,
    user = 'root',
    password = '123',
    database = 'day38',
    charset = 'utf8'  # 编码千万不要加-,如果写成了utf-8会直接报错
    autocommit = True  # 这个参数配置完成后,增删改操作都不需要再手动加conn.commit了
)
cursor = conn.cursor(pymysql.cursors.DictCursor)  # 产生一个游标对象,以字典的形式返回查询出来的数据,键是表的字段,值是表的字段对应的信息

# 新增
sql = 'insert into user(name,password) values("jerry","666")'
cursor.execute(sql)

  autocommit = True

  这个参数配置完成后,增删改操作都不需要再手动加conn.commit了

原文地址:https://www.cnblogs.com/francis1/p/11396619.html