pymysql实现MySQL与Python交互

Posted 云烟成雨。

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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注入问题。

以上是关于pymysql实现MySQL与Python交互的主要内容,如果未能解决你的问题,请参考以下文章

Python 与 MySQL 交互

python-python与mysql交互(pymysql)

Python操作MySQL数据库—pymysql库(可直接使用的模板通用操作)

Python操作MySQL数据库—pymysql库(可直接使用的模板通用操作)

Python操作MySQL数据库—pymysql库(可直接使用的模板通用操作)

python3与mysql交互