Python 连接 MySQL
一、安装MySQL驱动
1、分类
mysql-connector-python
- mysql 官方提供,纯python构建
PyMySQL
- 开源作者methane和adamchainz 提供,纯python构建
cymysql
- fork of pymysql,C构建
mysqlclient
- 开源作者methane提供,C构建
mysqldb
不适用于python3
1 2 3 4
| 1. 内置模块 Python自带 --- 不能直接连接MySQL 2. 自定义模块(自己写的) --- 可以但不会写 复杂 3. 第三方模块 --- 借助别人写好的代码 开源作者都会把第三方模块上传到Pypi社区,因此我们需要去Pypi社区下载别人写的代码用在自己的项目中
|
2、安装模块
1 2 3 4 5 6 7 8 9 10 11
| 三种安装方式: 1. pip install mysqlclient 即可。此时它会自动下载相应的文件并安装(需要联网)
2. 下载.whl文件 在cmd中执行 pip install mysqlclient-2.0.1-cp36-cp36m-win_amd64.whl 即可。建议直接将xxx.whl文件拖拽到cmd中
3. 到Pypi社区,下载压缩包.tar.gz文件,解压,进入解压目录下,在地址栏中输入cmd,执行python setup.py install 安装即可(不推荐)
# 注意: # 1. 如果使用pip时,提示 pip不是内部命令 需要配置环境变量(将python安装目录下的scripts目录,添加到系统的环境变量中,重启cmd)
# 2. 在使用pip之前,需要更新pip到最新版本 python -m pip install --upgrade pip
|
1
| # 使用Pip安装的第三方模块,会被放在python安装目录下的Lib/site-packages目录中,此时只要项目的解释器配置好了,就不需要在每个项目中拷贝mysqldb包,直接在代码中import MySQLdb即可 和 导入内置模块就一样了
|
1 2 3 4
| 1. pip指令是用于安装python第三方模块的 全称 Python install package 2. pip list 查看已安装的第三方模块 3. pip install xxx 安装第三方模块 4. pip uninstall xxx 卸载第三方模块
|
二、数据库操作API
1、获取连接
1 2 3 4 5 6 7 8 9
| import MySQLdb conn = MySQLdb.connect( host='localhost', port=3306, user="root", password="123456", db="testdb", charset="utf8" )
|
2、获得Cursor对象
3、执行SQL
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| row_count = cursor.execute("select id,name,salary from t_employee where id>5")
id=5 row_count = cursor.execute("select id,name,salary from t_employee where id>"+str(id))
sql = "insert into t_employee (name,salary,age) values('Mr_lee',100.33,18)" row_count = cursor.execute(sql)
name='Mr_lee' age=18 salary=50000 sql = "insert into t_employee (name,salary,age) values('%s',%f,%d)"%(name,salary,age) row_count = cursor.execute(sql)
|
4、执行查询
1 2 3 4
| row_count = cursor.execute("查询的sql语句") cursor.fetchone() cursor.fetchmany(3) cursor.fetchall()
|
cursor中是所有查到的数据,从中获取数据,需要向下移动游标,游标起始位置是第一行数据上一行
fetchone() 游标下移一行 ,获取一行数据(tuple),如果没有数据返回None
fetchmany(n) 游标下移n行,获取n行数据(tuple of tuple),如果没有数据返回空tuple:()
fetchall() 游标移动到底,获取所有数据行(tuple of tuple),如果没有数据返回空tuple:()
技巧:有值/None 非空tuple/空tuple 可以作为 True/False使用 ,判断是否查询到了数据
从cursor中获取的每一行数据的格式为一个tuple,其中是各列的值
数据表中的列类型和python类型的对应为:
5、执行增删改
1
| count = cursor.execute("增删改的sql语句") 返回影响的行数
|
执行增删改需要控制事务,提交或回滚事务
1 2
| conn.commit() 提交 conn.rollback() 回滚
|
6、资源回收
1 2 3 4 5 6
| cursor.close() conn.close()
conn.commit() cursor.close() conn.close()
|
7、cursor类型选择
1 2 3 4 5 6 7
| cursor = conn.cursor(MySQLdb.cursors.DictCursor) cursor.execute(sql)
cursor.fetchone()
cursor.fetchall()/fetchmany()
|
1 2 3 4 5 6 7 8
| # 总结Python操作Mysql的步骤: 1. 连接mysql conn = MySQLdb.connect(xxx) 2. 获取游标对象 conn.cursor(游标的类型) 3. 执行SQL语句 -- 指令可以是 增删改查 cursor.execute("SQL语句") 4. 根据SQL指令的不同,需要做不同的操作 如果是查询指令:cursor.fetchone/fetchmany/fetchall 如果是增删改指令:conn.commit() 5. 释放资源 关闭curse和conn
|
三、SQL中传递参数
1、SQL注入
所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令,攻击站点,达到入侵目的。
1 2 3 4 5
| name="' or '1'='1" sql = "select id,name,age from user where name='%s'" % name total = cursor.execute(sql3)
出现如上问题,根源:sql语句有字符串拼接
|
防止
1 2 3
| name="' or '1'='1" sql = "select id,name,age from user where name=%s" total = cursor.execute(sql,[name])
|
2、传递参数
用 %s
或 %(key)s
做占位符,接收参数
1 2 3 4 5
| sql = "select id,name,age from test where name=%s and id>%s" #%s 做占位符 total = cursor.execute(sql ,["Mr_lee" ,1] ) #列表
sql = "insert into test(name,age) values(%s,%s)" #%s 做占位符 total = cursor.execute(sql ,("Mr_lee" ,18) ) #元组
|
1 2 3 4
| # %(key)s 做占位符
sql = "select id,name,age from test where name=%(name)s and id>%(id)s" total = cursor.execute(sql , {"id":1,"name":"Mr_lee"} ) #dict
|
总结:在执行带参数的sql语句时,使用cursor.execute(sql,[name]) ,防止sql注入的攻击