pymysql介绍

一:安装

pip install pymysql

二:连接数据库

1:测试数据
#创表创库
create database user;use user;
create table name(
    id int primary key auto_increment,
    name varchar(20) unique key,
    password varchar(30)
);
# 插入数据
insert into name(name,password) values('ax',123456),('bx',654321),('lx',456789);

# 查看数据
select * from name

image-20200909195632128

二:使用pymysql

1:链接、执行sql、关闭(游标)
import pymysql

# 建立连接对象
conn=pymysql.connect(host='127.0.0.1',user='root',password='',port=3309,database='work') 
# 获取游标
cursor =  conn.cursor() # 执行完毕返回的结果集默认是以元组显示的

#currsor = conn.cursor(cursor=pymysql.cursors.DictCursor) # 执行完毕返回的结果集默认是以字典显示的

# 执行sql语句
sql = "select * from name where name='%s' and passowrd = '%s'" %(user,pwd) #注意%s需要加引号
print(sql)
res = cursor.execute(sql)  #执行sql语句,返回sql查询成功的记录数目
print(res)

cursor.close()
cursor.close()
if res:
	print("登录成功")
else:
    print("登录失败")
2:sql注入

注意:符号--会注释掉它之后的sql,正确的语法:--后至少有一个任意字符

根本原理:就根据程序的字符串拼接name='%s',我们输入一个xxx' -- hello,用我们输入的xxx加'在程序中拼接成一个判断条件name='xxx' -- hello'

最后那一个空格,在一条sql语句中如果遇到select * from t1 where id > 3 -- and name='ax';则--之后的条件被注释掉了

#1、sql注入之:用户存在,绕过密码
ax' -- 任意字符

#2、sql注入之:用户不存在,绕过用户与密码
xxx' or 1=1 -- 任意字符

image-20200909202444645

image-20200909202713076

image-20200909203014906

解决方法:

# 原来是我们对sql进行字符串拼接
# sql="select * from userinfo where name='%s' and password='%s'" %(user,pwd)
# print(sql)
# res=cursor.execute(sql)

#改写为(execute帮我们做字符串拼接,我们无需且一定不能再为%s加引号了)
sql="select * from userinfo where name=%s and password=%s" #!!!注意%s需要去掉引号,因为pymysql会自动为我们加上
res=cursor.execute(sql,[user,pwd]) #pymysql模块自动帮我们解决sql注入的问题,只要我们按照pymysql的规矩来。

三:增删改需要con.commit()

import pymysql

# 连接
con = pymysql.connect(host='127.0.0.1',user='root',
                      password='',database='user', port=3309)
# 游标
cursor = con.cursor()

# 执行sql语句
# <单条直接拼接1>
sql = "insert into name(name,password) values('beauty','beauty');"
res = cursor.execute(sql)  # 执行sql语句,返回sql影响成功的行数
print(res)

# <单条pymysql拼接2>
sql = "insert into name(name,password) values(%s,%s);"
res = cursor.execute(sql,('beauty','beauty'))  # 执行sql语句,返回sql影响成功的行数
print(res)

# <多条pymsqyl拼接3>
sql = 'insert into name(name,password) values(%s,%s)'
res = cursor.executemany(sql,[('one','one'),('two','two'),('three','three')])  #执行sql语句,返回sql影响成功的行数
print(res)

con.commit()  # 提交后才发现表中插入记录成功
cursor.close()
cursor.close()


# 注意我的name添加了unique key,如图

image-20200909204228427

四:查询

import pymysql

# 连接
con = pymysql.connect(host='127.0.0.1',user='root',
                      password='',database='user', port=3309)
# 游标
cursor = con.cursor()
sql = "select * from name;"
rows = cursor.execute(sql)  # 执行sql语句,返回sql影响成功的行数rows,将结果放入一个集合,等待被查询
cursor.scroll(3,mode='absolute')  # 相对位置移动,默认从0开始
cursor.scroll(2,mode='relative')  # 相对当前位置移动
res1 = cursor.fetchone()  # 单条查询
res2 = cursor.fetchone()
# res3 = cursor.fetchone()
# res4 = cursor.fetchmany()
# res5 = cursor.fetchall()  # 全部查询
print(res1)
print(res2)
# print(res3)
# print(res4)
# print(res5)

# for i in cursor:  # cursor是一个可迭代对象
#     print(i)

cursor.close()
conn.close()

五 获取插入的最后一条数据的自增ID

import pymysql

# 连接
con = pymysql.connect(host='127.0.0.1',user='root',
                      password='',database='user', port=3309)
# 游标
cursor = con.cursor()
sql = "insert into name(name,password) value(%s,%s)"
rows = cursor.execute(sql,['pig','pig'])
print(cursor.lastrowid)  # 只能插入数据才能看,最后的id
print(rows)
con.commit()
cursor.close()
con.close()

posted @ 2020-09-16 21:31  为了等  阅读(736)  评论(0)    收藏  举报