Python操作MySQL
一. python操作数据库介绍
Python 标准数据库接口为 Python DB-API,Python DB-API为开发人员提供了数据库应用编程接口。
Python 数据库接口支持非常多的数据库,你可以选择适合你项目的数据库:
- GadFly
- mSQL
- MySQL
- PostgreSQL
- Microsoft SQL Server 2000
- Informix
- Interbase
- Oracle
- Sybase
- …
你可以访问Python数据库接口及API查看详细的支持数据库列表。
不同的数据库你需要下载不同的DB API模块,例如你需要访问Oracle数据库和Mysql数据,你需要下载Oracle和MySQL数据库模块。
DB-API 是一个规范. 它定义了一系列必须的对象和数据库存取方式, 以便为各种各样的底层数据库系统和多种多样的数据库接口程序提供一致的访问接口 。
Python的DB-API,为大多数的数据库实现了接口,使用它连接各数据库后,就可以用相同的方式操作各数据库。
Python DB-API使用流程:
引入 API 模块。
获取与数据库的连接。
执行SQL语句和存储过程。
关闭数据库连接。
二. python操作MySQL模块
Python操作MySQL主要使用两种方式:
- DB模块(原生SQL)
- PyMySQL(支持python2.x/3.x)
- MySQLdb(目前仅支持python2.x)
- ORM框架
2.1.1 安装PyMySQL
PyMySQL是一个Python编写的MySQL驱动程序,让我们可以用Python语言操作MySQL数据库。
1 | pip install PyMySQL |
2.2 基本使用
1 | #! /usr/bin/env python |
2.3 获取最新创建的数据自增ID
1 | #! /usr/bin/env python |
2.4 查询操作
1 | #! /usr/bin/env python |
⚠️ 在fetch数据时按照顺序进行,可以使用cursor.scroll(num,mode)来移动游标位置,如:
- cursor.scroll(1,mode=’relative’) # 相对当前位置移动
- cursor.scroll(2,mode=’absolute’) # 相对绝对位置移动
2.5 防止SQL注入
1 | #! /usr/bin/env python |
这样,SQL操作就更安全了。如果需要更详细的文档参考PyMySQL文档吧。不过好像这些SQL数据库的实现还不太一样,PyMySQL的参数占位符使用%s这样的C格式化符,而Python自带的sqlite3模块的占位符好像是问号(?)。因此在使用其他数据库的时候还是仔细阅读文档吧。
Welcome to PyMySQL’s documentation
三. 数据库连接池
上文中的方式存在一个问题,单线程情况下可以满足,程序需要频繁的创建释放连接来完成对数据库的操作,那么,我们的程序/脚本在多线程情况下会引发什么问题呢?此时,我们就需要使用数据库连接池来解决这个问题!
3.1 DBUtils模块
DBUtils是Python的一个用于实现数据库连接池的模块。
此连接池有两种连接模式:
- 为每个线程创建一个连接,线程即使调用了close方法,也不会关闭,只是把连接重新放到连接池,供自己线程再次使用。当线程终止时,连接才会自动关闭
- 创建一批连接到连接池,供所有线程共享使用(推荐使用)
3.2 模式一
1 | #! /usr/bin/env python |
3.2 模式二
1 | #! /usr/bin/env python |
⚠️ 由于pymysql、MySQLdb等threadsafety值为1,所以该模式连接池中的线程会被所有线程共享,因此是线程安全的。
如果没有连接池,使用pymysql来连接数据库时,单线程应用完全没有问题,但如果涉及到多线程应用那么就需要加锁,一旦加锁那么连接势必就会排队等待,当请求比较多时,性能就会降低了。
3.3 加锁
1 | #! /usr/bin/env python |
3.4 无锁(报错)
1 | #! /usr/bin/env python |
此时可以在数据库中查看连接情况: show status like ‘Threads%’;
四. 数据库连接池结合pymsql使用
1 | # cat sql_helper.py |
PS: 可以利用静态方法封装到一个类中,方便使用