=============python操作MySQL============
一、链接,执行sql,关闭(游标)
import pymysql # 导入模块
user= input('用户名:>>').strip()
pwd= input('密码:>>').strip()
#先链接,拿到游标
conn=pymysql.connect(host='localhost',user='root',password='密码', database='数据库名',charset='utf8')
cursor=conn.cursor() #拿到游标,即mysql >
#执行sql
sql='select * from userinfo where user="%s" and password="%s";'%(user,pwd)
print(sql) #注意%s需要加双引号
rows = cursor.execute(sql) #拿到受影响的行数
cursor.close()
conn.close()
if rows:
print('登录成功')
else:
print('登录失败')
二、execute()之sql注入
- 注意:符号--会注释掉它之后的sql,正确的语法是:--后面至少有一个任意字符
根本原理:就是根据程序的字符串拼接name='%s',当输入一个xxx'--nnn,我们输入的xxx加'在程序中拼接成一个
判断条件name='xxx'--nnn'
-sql注入的两种情况
1.sql注入之:用户存在,绕过密码
name' -- 任意字符
2.sql注入之:用户不存在,绕过用户与密码
xxx' or 1=1 --任意字符
解释注入:
# 原来是我们对sql进行字符串拼接
# sql="select * from userinfo where name='%s' and password='%s'" %(user,pwd)
# print(sql)
# rows=cursor.execute(sql)
#改写为(execute帮我们做字符串拼接,我们无需且一定不能再为%s加引号了)
sql="select * from userinfo where name=%s
and password=%s" #!!!注意%s需要去掉引号,因为pymysql会自动为我们加上
rows=cursor.execute(sql,[user,pwd])
#pymysql模块自动帮我们解决sql注入的问题,只要我们按照pymysql的规矩来。
-- execute源码解释
def execute(self, query, args=None):
"""Execute a query
:param str query: Query to execute.
:param args: parameters used with query. (optional)
:type args: tuple, list or dict
:return: Number of affected rows
:rtype: int
If args is a list or tuple, %s can be used as a placeholder in the query.
If args is a dict, %(name)s can be used as a placeholder in the query.
"""
三、增、删、改、查:conn.commit()
=======增
import pymysql
先链接,拿到游标
conn=pymysql.connect(host='localhost',user='root',password='密码',database='数据库名')
cursor=conn.cursor() #拿到游标,即mysql >
#执行sql 增:
sql='insert into user1(user,password) VALUES (%s,%s)'
print(sql)
# rows = cursor.execute(sql,('xixi',123)) #插入一条记录 #参数:数组。字典。元组
rows = cursor.executemany(sql,[('xixi',123),('aaa',456),('ttt',147)]) #插入多行记录
print('%s row in set (0.00 sec)'%rows)
conn.commit() #提交到数据库
cursor.close()
conn.close()
=======删
import pymysql
#先链接,拿到游标
name=input('>>').strip()
conn=pymysql.connect(host='localhost',user='root',password='密码',database='数据库名')
cursor=conn.cursor() #拿到游标,即mysql >
#执行sql 删:
sql='delete from user1 where user =%s;' #删除数据
print(sql)
rows = cursor.execute(sql,(name))
print('%s row in set (0.00 sec)'%rows)
conn.commit() #提交到数据库
cursor.close()
conn.close()
=======改
import pymysql
#先链接,拿到游标
id=input('>>').strip()
conn=pymysql.connect(host='localhost',user='root',password='密码',database='数据库名')
cursor=conn.cursor() #拿到游标,即mysql >
#执行sql 改:
sql=' update user1 set password = "5555555" where id=%s;'
print(sql)
rows = cursor.execute(sql,(id))
print('%s row in set (0.00 sec)'%rows)
conn.commit() #提交到数据库
cursor.close()
conn.close()
========查(fetchont,fetchmany.fetchall)
---------查fetchone,fetchmany,fetchall-----------
import pymysql
conn=pymysql.connect(host='localhost',user='root',password='密码',database='数据库名')
cursor=conn.cursor() #拿到游标,即mysql >
#执行sql 查:
sql='select * from user1;'
rows = cursor.execute(sql)
#查单条fetchone
res1=cursor.fetchone()
res2=cursor.fetchone()
res3=cursor.fetchone()
print(res1)
print(res2)
print(res3)
print(res3[0])
#查多条fetchmany
print(cursor.fetchmany(3))
print(cursor.fetchone())
#查所有fetchall
print(cursor.fetchall())
print(cursor.fetchone())
#-------光标的移动--------
#1.绝对路径:从文件的开头位置算起
print(cursor.fetchall())
cursor.scroll(1,mode='absolute')
print(cursor.fetchone())
cursor.scroll(3,mode='absolute')
print(cursor.fetchone())
#2.相对路径:
print(cursor.fetchone())
print(cursor.fetchone())
cursor.scroll(2,mode='relative') #相对于上面的两条向后移两条
print(cursor.fetchone())
print('%s row in set (0.00 sec)' %rows)
cursor.close()
conn.close()
四、获取插入后的最后一条数据的自增ID
------查看表中最后一行的iD
import pymysql
conn=pymysql.connect(host='localhost',user='root',password='喵喵6',database='数据库名',charset='utf8')
cursor=conn.cursor()
sql='insert into user1(user,password) values(%s,%s);'
rows=cursor.execute(sql,('name','123'))
# rows=cursor.executemany(sql,[('aaa','123'),('bbb','123'),('ccc','12323')])
conn.commit()
print(cursor.lastrowid) #查看表中最后一行的iD
cursor.close()
conn.close()