pymysql
python中pymysql模块
# 实现:使用Python实现用户登录,如果用户存在则登录成功(假设该用户已在数据库中)
import pymysql
user = input('请输入用户名:')
pwd = input('请输入密码:')
# 1.连接
conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', password='', db='db8', charset='utf8')
# 2.创建游标
cursor = conn.cursor()
#注意%s需要加引号
sql = "select * from userinfo where username='%s' and pwd='%s'" %(user, pwd)
print(sql)
# 3.执行sql语句
cursor.execute(sql)
result=cursor.execute(sql) #执行sql语句,返回sql查询成功的记录数目
print(result)
# 关闭连接,游标和连接都要关闭
cursor.close()
conn.close()
if result:
print('登陆成功')
else:
print('登录失败')
二、execute()之sql注入
最后那一个空格,在一条sql语句中如果遇到select * from userinfo where username='app01' -- asadasdas' and pwd='' 则--之后的条件被注释掉了(注意--后面还有一个空格)
#1、sql注入之:用户存在,绕过密码
app01' -- 任意字符
#2、sql注入之:用户不存在,绕过用户与密码
xxx' or 1=1 -- 任意字符
#解决
# 原来是我们对sql进行字符串拼接
# sql="select * from userinfo where name='%s' and password='%s'" %(username,pwd)
# print(sql)
# result=cursor.execute(sql)
#改写为(execute帮我们做字符串拼接,我们无需且一定不能再为%s加引号了)
sql="select * from userinfo where name=%s and password=%s" #!!!注意%s需要去掉引号,因为pymysql会自动为我们加上
result=cursor.execute(sql,[user,pwd]) #pymysql模块自动帮我们解决sql注入的问题,只要我们按照pymysql的规矩来。
三、增 删 改 :一定要commit
import pymysql
# use = input('请输入用户名:')
# pwd = input('请输入密码:')
conn = pymysql.connect( host='localhost',
user='root',
password="123",
database='db8',
port=3306,
charset='utf8')
cursor = conn.cursor()
# sql = 'select * from userinfo where name = %(username)s and pwd = %(pwd)s ;'
# sql = 'insert into userinfo(name,pwd) values(%s,%s)'
# sql = 'update userinfo set name = %s where id=6'
sql = 'truncate table userinfo'
print(sql)
#增
'''插入一条数据用 execute'''
# res = cursor.execute(sql,[use,pwd])
'''插入多条数据使用executmany'''
# res = cursor.executemany(sql,[('李四','88888888'),('王五','666666')])
#改
# res = cursor.execute(sql,[use])
#删
res = cursor.execute(sql)
print(res)
'''注意这里-增--删--改- 操作的时候一定要加commit不然是写不进数据库的'''
conn.commit()
cursor.close()
conn.close()
四、查:fetchone,fetchmany,fetchall
游标移动位置:scroll(int,mode='relative')
relative 相对于自己进行移动
absolute 相对于左上角原点进行移动
import pymysql
conn = pymysql.connect( host='localhost',
user='root',
password="123",
database='db8',
port=3306,
charset='utf8')
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) # 原本返回的数据是一个大元组里有多个小元组,这里设置了就变成了一个列表里有多个字典
#查
sql = 'select * from userinfo'
cursor.execute(sql) # 执行命令
# row= cursor.fetchone() #返回的结果 获取下一行数据,以第一行为为首行
# print(row)
# row= cursor.fetchone()
# print(row)
# row = cursor.fetchall() #获取全部数据
row = cursor.fetchmany(8) # 获取多条数据,默认为0只获取第一条数据,加了数值就是获取几条数据,如果值比数据的条数大就获取全部
#-1不获取最后一条数据
#-2不获取最后两条数据
'''游标移动位置'''
cursor.scroll(2,mode='absolute') # 以左上角的原点为参照物进行移动,0为第一行的开始位置
row = cursor.fetchone()
print(row)
cursor.scroll(-1,mode='relative') #向对于本身进行移动,负值为向上,正值为向下
row = cursor.fetchone()
print(row)
cursor.close() #关闭游标
conn.close() #关闭连接