pymysql模块
安装
pip3 install pymysql
import pymysql
指定ip地址、端口、用户名、密码和数据库名,指定编码为utf8
conn = pymysql.connect(host='localhost',port=3306,user='root',password='123',database='test',charset='utf8')
cursor = conn.cursor()
# 游标 可以当成一个客户端的游标mysql>
sql语句
sql = "select * from userinfo where id=1"
print(sql)
ret = cursor.execute(sql)
# 执行sql语句,返回sql查询成功的记录数民,是个数字,是受sql语句影响到的记录行数
#all_data=cursor.fetchall() #获取返回的所有数据,注意凡是取数据,取过的数据就没有了,结果都是元祖格式的
#many_data=cursor.fetchmany(3) #一下取出3条数据,
#one_data=cursor.fetchone() #按照数据的顺序,一次只拿一个数据,下次再去就从第二个取了,因为第一个被取出去了,取一次就没有了,结果也都是元祖格式的
fetchone:(1, '男', 1, '理解')
fetchone:(2, '女', 1, '钢蛋')
fetchall:((3, '男', 1, '张三'), (4, '男', 1, '张一'))
也可以切换成字典格式的
cursor=conn.cursor(cursor=pymysql.cursors.DictCursor) 获取的结果就是字典格式
{'sid': 1, 'gender': '男', 'class_id': 1, 'sname': '理解'} {'字段名':值}
上面的fetchone,fetchmany,fetchall虽然说都取完了,但是可以通过seek移动光标
# 绝对移动的演示
# print(cursor.fetchall())
# cursor.scroll(3,'absolute')
从初始位置往后移动三条,那么下次取出的数据为第四条数据
# print(cursor.fetchone())
# 相对移动的演示
# print(cursor.fetchone())
# cursor.scroll(1,'relative')
通过上面取了一次数据,游标的位置在第二条的开头,现在相对移动了一个记录,那么下次再取,取出的是第三条,相对于上一条,往下移动了一条
cursor.close() 关闭游标
conn.close() 关闭连接
不过这样查询sql语句,回引发sql注入漏洞
因为你的sql语句可能会和用户的语句打交道,所有可能是下面这样的:
select * from userinfo where user=’ ’ or ‘1’ = ’ 1 ’ and password=’ ’ or ‘1’ = ’ 1 ';
只需要写‘or ’1‘ = ’1 即可,这样就把前面的引号和后面的引号闭合了
请输入用户名:xxx' or 1=1 -- xxxxxx
请输入密码:
select * from userinfo where username='xxx' or 1=1 -- xxxxxx' and password='';
3
登陆成功
我们只输入了一个xxx' 加or 加 1=1 加 -- 加任意字符串
看上面被执行的sql语句你就发现了,or 后面跟了一个永远为真的条件,那么即便是username对不上,但是or后面的条件是成立的,也能够登陆成功。
pymysql避免sql注入
sql = "select * from userinfo where username='%s' and password='%s';
cursor.execute(sql,[uname,pword])
# 把用户名和密码放这儿即可避免sql注入
上面是查的方法
下面说一下增删改的方法
增、删、改–conn.commit()
import pymysql
conn = pymysql.connect(host='localhost',port='3306',user='root',password='123',database='crm',charset='utf8')
cursor = conn.cursor()
# part1
# 执行sql语句
sql = 'insert into userinfo(name,password) values('root','123456');
res = cursor.execute(sql)
print(res)
print(cursor.lastrowid)
# 返回的是你插入的这条记录是到了第几条了
#part2
# sql='insert into userinfo(name,password) values(%s,%s);'
# res=cursor.execute(sql,("root","123456")) #执行sql语句,返回sql影响成功的行数
# print(res)
#还可以进行更改操作:
#res=cursor.excute("update userinfo set username='taibaisb' where id=2")
#print(res) #结果为1
#part3
sql='insert into userinfo(name,password) values(%s,%s);'
res=cursor.executemany(sql,[("root","123456"),("lhf","12356"),("eee","156")]) #执行sql语句,返回sql影响成功的行数,一次插多条记录
print(res)
#上面的几步,虽然都有返回结果,也就是那个受影响的函数res,但是你去数据库里面一看,并没有保存到数据库里面,
conn.commit()
#必须执行conn.commit,注意是conn,不是cursor,执行这句提交后才发现表中插入记录成功,没有这句,上面的这几步操作其实都没有成功保存。
cursor.close()
conn.close()
查 fetchone,fetchmany,fetchall
import pymysql
conn=pymysql.connect(host='localhost',user='root',password='123',database='egon')
#游标
cursor=conn.cursor()
sql = "select * from userinfo;"
rows = cursor.execute(sql)
# cursor.scroll(3,mode='absolute') # 相对绝对位置移动
# cursor.scroll(3,mode='relative') # 相对当前位置移动
res1=cursor.fetchone()
res2=cursor.fetchone()
res3=cursor.fetchone()
res4=cursor.fetchmany(2)
res5=cursor.fetchall()
print(res1)
print(res2)
print(res3)
print(res4)
print(res5)
print('%s rows in set (0.00 sec)' %rows)
conn.commit() #提交后才发现表中插入记录成功
cursor.close()
conn.close()
'''
(1, 'root', '123456')
(2, 'root', '123456')
(3, 'root', '123456')
((4, 'root', '123456'), (5, 'root', '123456'))
((6, 'root', '123456'), (7, 'lhf', '12356'), (8, 'eee', '156'))
rows in set (0.00 sec)
'''
获取插入的最后一条数据的自增ID
import pymysql
conn=pymysql.connect(host='localhost',user='root',password='123',database='egon')
cursor=conn.cursor()
sql='insert into userinfo(name,password) values("xxx","123");'
rows=cursor.execute(sql)
print(cursor.lastrowid) #在插入语句后查看
conn.commit()
cursor.close()
conn.close()