zoukankan      html  css  js  c++  java
  • 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注入问题。

  • 相关阅读:
    SCUT
    模板
    重链剖分
    树的重心
    SCUT
    SCUT
    SCUT
    SCUT
    SCUT
    SCUT
  • 原文地址:https://www.cnblogs.com/liuyinzhou/p/8031963.html
Copyright © 2011-2022 走看看