pymysql实现MySQL与Python交互
常见MySQL操作
所需模块:
1 pip3 install pymysql
查询(fetchone,fetchmany,fetchall):
1.fetchone
1 import pymysql 2 3 con = pymysql.connect(host="localhost", user="root", password="admin", database="pysql", charset="utf8") 4 cursor = con.cursor() 5 try: 6 # 当id设置为主键,但是没有设置为自增时,则必须给id字段赋值,否则会报错。 7 sql = "select * from userinfo;" 8 cursor.execute(sql) 9 # 单使用一个fetchone会获取索引为0的记录,若使用多个fetchone时,会按照前一个的索引值继续向下获取记录 10 data1 = cursor.fetchone() 11 data2 = cursor.fetchone() 12 data3 = cursor.fetchone() 13 except Exception as e: 14 print("error") 15 cursor.close() 16 con.close() 17 print(data1) 18 print(data2) 19 print(data3)
2.fetchmany
1 import pymysql 2 3 con = pymysql.connect(host="localhost", user="root", password="admin", database="pysql", charset="utf8") 4 cursor = con.cursor() 5 try: 6 # 当id设置为主键,但是没有设置为自增时,则必须给id字段赋值,否则会报错。 7 sql = "select * from userinfo;" 8 cursor.execute(sql) 9 # 和fetchone相同:单个从0开始获取查询,多个从上一个的索引之后进行查询 10 data1 = cursor.fetchmany(3) 11 data2 = cursor.fetchmany(5) 12 except Exception as e: 13 print("error") 14 cursor.close() 15 con.close() 16 print(data1) 17 print(data2)
3.fetchall
1 import pymysql 2 3 con = pymysql.connect(host="localhost", user="root", password="admin", database="pysql", charset="utf8") 4 cursor = con.cursor() 5 try: 6 # 当id设置为主键,但是没有设置为自增时,则必须给id字段赋值,否则会报错。 7 sql = "select * from userinfo;" 8 cursor.execute(sql) 9 # 单使用一个fetchmany会获取所有记录,若使用多个fetchone时,其余的fetchall()结果为空 10 data1 = cursor.fetchall() 11 data2 = cursor.fetchall() 12 except Exception as e: 13 print("error") 14 cursor.close() 15 con.close() 16 print(data1) 17 print(data2)
插入、更新、修改(最后需要提交)
1 import pymysql 2 conn=pymysql.connect(host='localhost',user='root',password='admin',database='db1') 3 cursor=conn.cursor() 4 sql='insert into user(name,password) values("xxx","123");' 5 rows=cursor.execute(sql) 6 print(cursor.lastrowid) #在插入语句后查看最新一条记录id 7 # pymysql.connect 类默认开启了事务,因此对表进行修改、更新、删除、插入操作时需要提交事务才可以生效 8 conn.commit() 9 cursor.close() 10 conn.close()
SQL注入
名词解释:
SQL注入是对Python与MySQL进行动态数据校验时,用户故意输入非法字段,从而绕过数据校验的行为。
1 import pymysql 2 user=input('用户名: ').strip() 3 pwd=input('密码: ').strip() 4 5 #链接 6 conn=pymysql.connect(host='localhost',user='root',password='admin',database='db1',charset='utf8') 7 #游标 8 cursor=conn.cursor() #执行完毕返回的结果集默认以元组显示 9 #执行sql语句 10 sql='select * from user where name="%s" and password="%s"' %(user,pwd) #注意%s需要加引号 11 print(sql) 12 res=cursor.execute(sql) #执行sql语句,返回sql查询成功的记录数目 13 cursor.close() 14 conn.close() 15 16 if res: 17 print('登录成功') 18 else: 19 print('登录失败')
正常情况下的输入过程:
故意绕过验证的非法输入
当知道用户名时:
虽然知道密码,但输入的密码不匹配却成功登陆。
用户名和密码都不知道时:
虽然不知道用户名和密码,却成功登陆。
SQL注入的中心思想就是人为的输入SQL语句中的特殊字符串,绕过验证。"--"在MySQL中为注释字符,通过此方法可以屏蔽部分代码,从而绕过验证。
解决办法:
使用MySQL的内置方法校验输入字符串的合法性,提高安全性。
1 import pymysql 2 user=input('用户名: ').strip() 3 pwd=input('密码: ').strip() 4 5 #链接 6 conn=pymysql.connect(host='localhost',user='root',password='admin',database='db1',charset='utf8') 7 #游标 8 cursor=conn.cursor() #执行完毕返回的结果集默认以元组显示 9 #执行sql语句 10 sql='select * from user where name=%s and password=%s'#注意%s没有加引号 11 print(sql) 12 res=cursor.execute(sql,[user,pwd]) #执行sql语句,返回sql查询成功的记录数目 13 cursor.close() 14 conn.close() 15 if res: 16 print('登录成功') 17 else: 18 print('登录失败')
校验验证:
成功解决SQL注入问题。
感谢您的阅读,如果您觉得阅读本文对您有帮助,请点一下"推荐"按钮,本文欢迎各位转载,但是转载文章之后必须在文章页面中给出作者和原文连接,谢谢。