python操作MySQL
# 导入第三方模块
import pymysql
# 链接服务端
db = pymysql.connect(
host='127.0.0.1', # MySQL服务的IP地址
port=3306, # MySQL默认PORT端口号
user='root', # 用户名
password='', # 密码(简写:passwd)
database='test', # 数据库名称(简写:db)
charset='utf8' # 字符编码
# autocommit=True # 自动二次确认
)
# 产生获取命令的游标对象
cursor = db.cursor(
cursor=pymysql.cursors.DictCursor
) # 括号内不写参数,数据是元组要元组 不够精确 添加参数则会将数据处理成字典
sql = 'show tables'
# 执行SQL语句,并返回受影响的行数
affect_row = cursor.execute(sql)
print(affect_row)
# 注意:insert、update、delete 等修改数据的语句需要二次确认
conn_obj.commit() # 手动二次确认
# 获取SQL语句执行后的结果
res = cursor.fetchall()
print(res)
查询数据
fetchone()
:获取查询结果的所有行。将所有行作为元组列表返回。如果没有要获取的记录,则返回一个空列表。fetchmany(size)
:返回参数指定的行数size
。当重复调用时,此方法获取查询结果的下一组行并返回元组列表。如果没有更多行可用,则返回一个空列表fetchall()
:该方法返回单个行记录,如果没有更多行可用,则返回 None
游标控制
cursor.scroll(1, 'relative')
:相对于当前位置游标往后移动一个单位cursor.scroll(1, 'absolute')
:相对于起始位置游标往后移动一个单位
事务处理
- 开启事务
db.begin()
- 提交修改
db.commit()
- 回滚事务
db.rollback()
SQL注入问题
准备数据
create table admin(username varchar(32),password varchar(32));
insert into admin (username,password) values('kevin','123');
注入问题
import pymysql
db = pymysql.connect(
host='127.0.0.1',
port=3306,
user='root',
password='',
database='test',
charset='utf8'
)
cursor = db.cursor(
cursor=pymysql.cursors.DictCursor
)
username = input("请输入用户名>>>").strip()
password = input("请输入密码>>>").strip()
sql = "select username,password from admin where username = '%s' and password = '%s'" % (username, password)
affect_row = cursor.execute(sql)
res = cursor.fetchall()
if res:
print("登录成功")
else:
print("用户名或密码错误")
这样会导致如果用户输入' or 1=1 #
恶意字符串,拼接在SQL语句也会登录成功
select username,password from admin where username = '' or 1=1 #' and password = ''
解决办法
解决SQL注入的问题其实也很简单就是过滤掉特殊符号,execute方法自带校验SQL注入问题 自动处理特殊符号
ssql = "select username,password from admin where username = %s and password = %s"
cursor.execute(sql, (username, password))
补充:以后涉及到敏感数据的拼接全部交给execute方法就好了