pymysql连接

安装

pip3 install pymysql

使用操作

import pymysql

#创建连接
conn = pymysql.connect(host='192.168.43.154',
                       port=3306,
                       user='root',
                       passwd='123456',
                       db='mydb',
                       charset='utf8')
#创建游标
cursor = conn.cursor()
'''
cursor中还没有数据,只有等到fetchone()或fetchall()的时候才返回一个元组tuple,才支持len()和index()操作,这也是它是迭代器的原因。但同时为什么说它是生成器呢?因为cursor只能用一次,即每用完一次之后记录其位置,等到下次再取的时候是从游标处再取而不是从头再来,而且fetch完所有的数据之后,这个cursor将不再有使用价值了,即不再能fetch到数据了。
'''

#执行的收起来语句
sql1 = "insert into stuinfo values (9,'小李','男',20,'汉中')"
sql2 = "select * from stuinfo"

#执行
cursor.execute(sql1)
cursor.execute(sql2)

# 获取结果的第一行数据
# row_1 = cursor.fetchone()
# print(row_1)

# 获取剩余结果前n行数据
# row_2 = cursor.fetchmany(3)
# print(row_2)

# 获取剩余结果所有数据
row_3 = cursor.fetchall()
print(row_3)

#提交
conn.commit()
cursor.close()
conn.close()

获取数据自增ID

import pymysql
 
#创建连接
conn = pymysql.connect(host='192.168.43.154',
                       port=3306,
                       user='root',
                       passwd='123456',
                       db='User',
                       charset='utf8')
ursor = conn.cursor()
effect_row = cursor.executemany("insert into tb7(user,pass,num)values(%s,%s,%s)", [("user1","pass1","1"),("user2","pass2","2")])
conn.commit()
cursor.close()
conn.close()
#获取自增id
new_id = cursor.lastrowid      
print(new_id)

游标的移动

注:在fetch数据时按照顺序进行,可以使用cursor.scroll(num,mode)来移动游标位置,如:
 
cursor.scroll(1,mode='relative') # 相对当前位置移动
cursor.scroll(2,mode='absolute') # 相对绝对位置移动

fetch数据类型

import pymysql
 
#创建连接
conn = pymysql.connect(host='192.168.43.154',
                       port=3306,
                       user='root',
                       passwd='123456',
                       db='User',
                       charset='utf8')
                       
#游标设置为字典类型
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
cursor.execute("select * from User")
 
row_1 = cursor.fetchone()
print(row_1) 
 
conn.commit()
cursor.close()
conn.close()

关于pymysql防注入

字符串拼接查询,造成注入

import pymysql
 
conn = pymysql.connect(host='192.168.43.154',
                       port=3306,
                       user='root',
                       passwd='',
                       db='User',
                       charset='utf8')
 
cursor = conn.cursor()
 
username=input()
password =input()
# 正常构造语句的情况
sql = "select user,pwd from User where user='%s' and pwd='%s'" % (username,password)

row_count = cursor.execute(sql)
row_1 = cursor.fetchone()
print(row_count, row_1)
conn.commit()
cursor.close()
conn.close()

'''
按照上述的方法用户可以实现非法登录输入:
username: ‘or 1 = 1 –-

password:

当输入了上面的用户名和密码,服务端的sql就变成:

sql = "select user,pwd from User where user=‘'or 1 = 1 –-' and pwd='%s'"
因为条件后面username=”or 1=1 用户名等于 ” 或1=1 那么这个条件一定会成功;然后后面加两个-,这意味着注释,它将后面的语句注释,让他们不起作用,这样语句永远都能正确执行,用户轻易骗过系统,获取合法身份。
'''

避免注入,使用pymysql提供的参数化语句

注意:excute执行SQL语句的时候,必须使用参数化的方式,否则必然产生SQL注入漏洞。
import pymysql
 
conn = pymysql.connect(host='192.168.43.154',
                       port=3306,
                       user='root',
                       passwd='',
                       db='User',
                       charset='utf8')
 
cursor = conn.cursor()
 
username= input()
password =input()

#执行参数化查询
row_count=cursor.execute("select user,pwd from User where user='%s' and pwd='%s'" ,(username,password))

'''
execute()函数本身就有接受SQL语句变量的参数位,只要正确的使用(直白一点就是:使用”逗号”,而不是”百分号”)就可以对传入的值进行correctly转义,从而避免SQL注入的发生。

内部执行参数化生成的SQL语句,对特殊字符进行了加\转义,避免注入语句生成。
sql=cursor.mogrify("select user,pwd from User where user='%s' and pwd='%s'" ,(username,password))
print (sql)
'''
 
row_1 = cursor.fetchone()
print(row_count,row_1)
 
conn.commit()
cursor.close()
conn.close()
发布了63 篇原创文章 · 获赞 1 · 访问量 2041

猜你喜欢

转载自blog.csdn.net/qq_45061361/article/details/104107567