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()

 

posted @ 2019-05-16 18:45  不忘初心❤  阅读(1511)  评论(0编辑  收藏  举报