pymysql模块
pymysql是用python控制终端对MySQL数据库进行操作的第三方模块
import pymysql # 1.连接数据库 client = pymysql.connect( # 地址 host='127.0.0.1', # 数据库端口 port=3306, # 用户名,要加引号 user='root', # 密码,要加引号 password='2694', # 文件夹 database='db2', # 设置字符编码不能写成了utf-8 charset='utf8', # 设置自动提交命令,如不设置则无法提交命令进行增,改,删操作 autocommit=True ) # 2.获取游标对象 ——————》可以通过游标来提交SQL命令, # cursor_obj = client.cursor() 以元组形式返回 # pymysql.cursors.DictCursor 将查询出来的结果制作成字典形式返回 cursor_obj = client.cursor(pymysql.cursors.DictCursor) # 3.通过execute提交SQL语句 # SQL语句要用引号,不要加 ; 号 sql = 'select * from emp' # 提交SQL语句 cursor_obj.execute(sql) # 4.提交后,通过cursor_obj.fetchall()获取查询游标后的全部的结果 res = cursor_obj.fetchone() # 只获取游标后的一条结果 res = cursor_obj.fetchall() # 获取查询游标后的全部的结果 res = cursor_obj.fetchmany(3) # 指定获取游标后的几条数据,可以超过不会报错 # 获取的是列表套字典 # print(res) for dic in res: print(dic) # 5.关闭游标 cursor_obj.close() # 6.关闭客户端连接 client.close()
游标的相对移动和绝对移动
print(cursor_obj.fetchone()) #获取一个结果 print(cursor_obj.fetchone()) print(cursor_obj.fetchall()) #获取所有结果 # print(cursor.fetchmany(2)) # 指定获取几条数据 如果数字超了也不会报错 >>>{'id': 1, 'name': 'Mr沈', 'sex': 'male', 'age': 17} {'id': 2, 'name': 'tate', 'sex': 'male', 'age': 18} [{'id': 3, 'name': 'ank', 'sex': 'male', 'age': 18},{'id': 4, 'name': 'vicky', 'sex': 'female', 'age': 18}]
如果想控制游标的移动位置来获取结果可以用相对移动或绝对移动
相对移动:cursor.scroll(2, 'relative') # 基于指针所在的位置往后偏移两位,下次获取就获取指针后的数据 绝对移动:cursor.scroll(1, 'absolute') #基于起始位置往后偏移1位
SQL注入问题
SQL注入问题:利用特殊符号和注释语法,巧妙的绕过真正的SQL校验
解决方法:关键性的数据校验,不要手动拼接,execute会自带拼接功能,可以解决这个问题
import pymysql client = pymysql.connect( host='127.0.0.1', port=3306, database='day36', user='root', password='2694', charset='utf8', autocommit=True ) cursor_obj = client.cursor(pymysql.cursors.DictCursor) username = input('请输入用户名').strip() password = input('请输入密码:').strip() # sql = 'select * from db where username="%s" and password="%s"'%(username,password) # 此处%s必须要加引号 sql = 'select * from db where username="%s" and password="%s"' # 此处%s可以不用加引号 print(sql) res = cursor_obj.execute(sql,(username,password)) # 自带拼接功能将execute后的参数与SQL一一对应传入,只能替换%占位符 if res: print(res) # 显示所有操作的数据条数 else: print('用户名或密码错误') #请输入用户名wqjed" or 2=2 -- wqjdkef # 请输入密码: # select * from db where username="wqjed" or 2=2 -- wqjdkef" and password="" # 1 # 请输入用户名shen" -- weiqfewq # 请输入密码: # select * from db where username="shen" -- weiqfewq" and password="" # 1
数据的增删改查
import pymysql # 连接数据库函数 def client_mysql(): client = pymysql.connect( host='127.0.0.1', port=3306, # 端口号不能加引号 user='root', password='2694', database='db2', charset='utf8', autocommit=True ) cursor_obj = client.cursor(pymysql.cursors.DictCursor) return cursor_obj, client # 关闭数据库函数 def close_client(): cursor_obj, client = client_mysql() cursor_obj.close() client.close() cursor_obj, client = client_mysql() # 插入数据 # 插入表格 sql = 'create table user(id int primary key,name varchar(20))' cursor_obj.execute(sql) # 插入数据 s = 'insert into user(id,name) values(7,"vicky")' cursor_obj.execute(s) # 查看数据 res = 'select * from user' cursor_obj.execute(res) res = cursor_obj.fetchall() print(res) # 更新数据 try: sql = 'update user set name="shen" where id=7' cursor_obj.execute(sql) except Exception as e: print(e) res = 'select * from user' # 查看更新后的数据 cursor_obj.execute(res) res = cursor_obj.fetchall() print(res) # 删除数据 sql = 'delete from user' cursor_obj.execute(sql) # 查看更新后的数据 res = 'select * from user' cursor_obj.execute(res) res = cursor_obj.fetchall() print(res) # 关闭连接 close_client()