python获取sql数据的操作,pymysql模块
第一步:安装pymysql模块
可以在cmd命令行敲....pip3 install pymysql
也可以在pycham中添加
然后上代码:
import pymysql
#连接上数据库 conn=pymysql.Connect( host="localhost", user="root", password="123", database="user", charset="utf8" )
#建立一个游标 cursor=conn.cursor(cursor=pymysql.cursors.DictCursor)
sql="select * from emp"
res=cursor.execute(sql)#execute 执行 括号里直接跟sql语句,我们可以向这个样赋值给一个变量,然后再执行 print(res) # 打印出来的不是结果,而是受影响的条数 # re=cursor.fetchall() #调用这个方法获取全部内容 re=cursor.fetchone() # 这个方法就是获取第一条内容 print(re)
#下面的操作就是关闭连接了。 cursor.close() conn.close()
这就是一个最简单的python连接数据库进行查询的最简单的操作,下面来扩展一下
我们要先在数据库里建立一个用户表,存放用户名个密码
import pymysql #链接 conn=pymysql.connect( host='localhost', user='root', password='123', database='egon', charset='utf8') #游标 cursor=conn.cursor() #执行完毕返回的结果集默认以元组显示 #cursor=conn.cursor(cursor=pymysql.cursors.DictCursor) # 以字典的方式显示数据 # 3.pymysql操作数据库 #执行sql语句 user = input(">>>:").strip() pwd = input(">>>:").strip() sql='select * from userinfo where name="%s" and password="%s"' %(user,pwd) #注意%s需要加引号 rows=cursor.execute(sql) #执行sql语句,返回sql查询成功的记录数目
# 获取真实数据cursor.fetchone(),cursor.fetchall(),cursor.fetchmany(),类似管道取值,获取一条,所有,多条 cursor.scroll(1,'relative') # 相对移动
#当前位置往后数一条取开始取数据 cursor.scroll(3,'absolute') # 绝对移动
#从文件开头数,第三条数据后开始取 cursor.close() conn.close()
SQL注入
基于以上的代码,会出现一个问题:
我们称为 SQL注入:
# 用户名正确 username >>>: root' -- jjsakfjjdkjjkjs # 用户名密码都不对的情况 username >>>: xxx' or 1=1 --asdjkdklqwjdjkjasdljad password >>>: ''
为什么会出现这种问题,我们首先应该想到, “--” 在sql中代表的是什么?
“-- ” 就是注释的意思,将sql后面的语句注释了
下面的 1=1,条件为真,为真的话自然就可以直接获取到我们需要的数据了
怎么解决这个问题呢?
sql有一个自动完成拼接的方法,就是把username和password 写在执行语句的后面
import pymysql conn=pymysql.connect( host='localhost', user='root', password='123', database='user' ) cursor=conn.cursor(pymysql.cursors.DictCursor) user=input('>>>:') pwd=input('>>>:') sql="select * from user where username=%s and password=%s" res=cursor.execute(sql,(user,pwd)) if res: print('登录成功') else: print( '登录失败' ) cursor.close() conn.close()
基于上面的内容我们可以实现增删改的操作
# 增 sql = "insert into user(username,password) values(%s,%s)" rows = cursor.excute(sql,('jason','123')) # 修改 sql = "update user set username='jasonDSB' where id=1" rows = cursor.excute(sql) """ 增和改单单执行excute并不会真正影响到数据,需要再执行conn.commit()才可以完成真正的增改 """ # 一次插入多行记录 res = cursor,excutemany(sql,[(),(),()]
可能有的人执行到这来发现数据库的信息并没有变化~
原因很简单,增和改单单执行excute并不会真正影响到数据,需要再执行conn.commit()才可以完成真正的增改
我们需要在执行语句后加入 conn.commit()
然后在看看执行后的数据库有没有发生变化
import pymysql conn=pymysql.connect(host='localhost',user='root',password='123',database='user') cursor=conn.cursor() sql="insert into user(username,password) values(%s,%s)"
#插入用户数据 cursor.executemany(sql,[('user1','123'),('user2','123'),('user3','123'),]) conn.commit() cursor.close() conn.close()