## 一、引言
Python操作MySQL一共有两种方式,第一种是用原生模块pymysql和mysqldb,这两种模块在py2中都支持,但是在py3中只支持pymysql,但是pymysql可以通过pymysql.install\_as\_MySQLdb()的方式构造成和mysqldb一样的使用;第二种方式是ORM框架 SQLAchemy。
## 二、pymysql
### 下载安装
~~~
pip install pymysql
~~~
### 增、删、改
~~~
import pymysql
# 增,删,改除了sql语句不同,使用的方式一致
conn = pymysql.connect(host="localhost",user='root',password='',database="db2") #连接mysql
cursor = conn.cursor() #创建游标
sql = "insert into userinfo(username,password) values(%s,%s)" #sql语句
~~~
~~~
#r表示执行这条语句受影响的行数
r = cursor.execute(sql ,['wusir','123'])
#r = cursor.executemany(sql ,[('jack','213'),('tom','234')]) #表示插入多条数据,只有在插入数据的时候才使用executemany
~~~
~~~
conn.commit() #增删改执行一定要加conn.commit()
cursor.close() #关闭游标
conn.close() #关闭连接
~~~
### 查
~~~
# 查
conn = pymysql.connect(host="localhost",user='root',password='',database="db2")
# cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) #使用这种游标查出来的数据是列表套子典
cursor = conn.cursor() #使用这种游标查出来的数据是元祖套元祖
sql = "select * from userinfo"
cursor.execute(sql)
#cursor.scroll(1,mode='relative') # 让游标相对当前位置移动
#cursor.scroll(2,mode='absolute') # 让游标相对绝对位置移动
#result = cursor.fetchone() # 取一个数据
#print(result)
#result = cursor.fetchmany(4) #取指定数目的数据
#print(result)
result = cursor.fetchall() #取查出来的所有数据
print(result)
cursor.close()
conn.close()
#PS:每取一个数据游标就会向下移动一位
# 新插入数据的自增ID: cursor.lastrowid
# 如当有一个主从表时,从表要根据主表的id变化来插入数据,这时可以使用cursor.lastrowid来获取最新插入的主表id。
~~~
### 避免mysql注入
写一个很简单的基于mysql的登录程序,数据库里面只有一个user为alex,pwd为123,当使用第一种写法时会出现mysql注入的情况。
~~~
import pymysql
user = input('>>请输入用户名:')
pwd = input('>>请输入密码:')
conn = pymysql.connect(host='127.0.0.1',user='root',password='',database='db2')
cursor = conn.cursor()
#第一种写法(不可以)
sql = "select * from userinfo where name='%s' and pwd='%s'"%(user,pwd)
cursor.execute(sql)
res = cursor.fetchone()
print(res)
#第二种写法(可以)
sql = "select * from userinfo where name=%s and pwd=%s"
cursor.execute(sql,[user,pwd])
res = cursor.fetchone()
print(res)
~~~
~~~
#第三种写法(可以)
sql = "select * from userinfo where name=%(u)s and pwd=%(p)s"
cursor.execute(sql,{'u':user,'p':pwd})
res = cursor.fetchone()
print(res)
~~~
~~~
if res:
print('登陆成功')
else:
print('登陆失败')
~~~
![](https://img.kancloud.cn/55/58/5558a965e2ebe20259838bc88e649dea_721x181.png)
这就是mysql注入,因为mysql中的注释是--,使用这种字符串拼接会将后面的语句注释掉,同时1=1成立,这样就会出现即使没有这个用户也会登录成功。
- Python学习
- Python基础
- Python初识
- 列表生成式,生成器,可迭代对象,迭代器详解
- Python面向对象
- Python中的单例模式
- Python变量作用域、LEGB、闭包
- Python异常处理
- Python操作正则
- Python中的赋值与深浅拷贝
- Python自定义CLI三方库
- Python并发编程
- Python之进程
- Python之线程
- Python之协程
- Python并发编程与IO模型
- Python网络编程
- Python之socket网络编程
- Django学习
- 反向解析
- Cookie和Session操作
- 文件上传
- 缓存的配置和使用
- 信号
- FBV&&CBV&&中间件
- Django补充
- 用户认证
- 分页
- 自定义搜索组件
- Celery
- 搭建sentry平台监控
- DRF学习
- drf概述
- Flask学习
- 项目拆分
- 三方模块使用
- 爬虫学习
- Http和Https区别
- 请求相关库
- 解析相关库
- 常见面试题
- 面试题
- 面试题解析
- 网络原理
- 计算机网络知识简单介绍
- 详解TCP三次握手、四次挥手及11种状态
- 消息队列和数据库
- 消息队列之RabbitMQ
- 数据库之Redis
- 数据库之初识MySQL
- 数据库之MySQL进阶
- 数据库之MySQL补充
- 数据库之Python操作MySQL
- Kafka常用命令
- Linux学习
- Linux基础命令
- Git
- Git介绍
- Git基本配置及理论
- Git常用命令
- Docker
- Docker基本使用
- Docker常用命令
- Docker容器数据卷
- Dockerfile
- Docker网络原理
- docker-compose
- Docker Swarm
- HTML
- CSS
- JS
- VUE