简单介绍:
说明: 此模块儿主要提供PY连接关系型数据库管理系统MySQL的接口,主要提供C(Create)R(Read)U(Update)D(Delete)接口,基于C API实现
快速安装:
pip install mysql-python yum -y install MySQL-python
连接对象:
MySQLdb.connect(host='10.2.5.51', port=3306, user='root', passwd='root', db='pyweb', charset='utf8') -> conn
说明: 创建并返回一个数据库连接对象
conn.cursor() -> cursor
说明: 获取游标对象
conn.close() -> None
说明: 关闭数据库连接对象
游标对象:
cursor.execute(query, args) -> long
说明: 执行单条sql语句,接收的参数为sql语句本身和使用的参数列表,返回值为受影响的行数
cursor.executemany(query, args) -> long
说明: 执行单条sql语句,但是重复执行参数列表里的参数,返回受影响的行数
cursor.rowcount -> int
说明: 只读属性,并返回执行excute/excutemany方法后影响的行数
cursor.fetchone() -> tuple
说明: 返回包含一个结果集的元组
cursor.fetchall() -> tuple
说明: 返回包含全部结果集的元组
cursor.fetchmany(size=None) -> tuple
说明: 返回指定条结果集的元组
cursor.callproc(procname, args) -> tuple
说明: 用来执行存储过程,接收的参数为存储过程名和参数列表,返回值为受影响的行数
cursor.nextset()
说明: 移动到下一个结果集
cursor.scroll(value, mode='relative') -> None
说明:mode='relative'则表示从当前所在行跳过value条,如果mode='absolute',则表示从结果集中的第一条跳过value条
最佳实践:
1. Connect类源码中__enter__默认返回了游标,__exit__默认自动回滚,而这两个正是with语句的实现,它会自动判断当前是否有错误,有错误就自动回滚,没有则进行事务提交,而无需自己手动try捕捉回滚,所以在运维开发中常常会利用此特性来操作事务(主要用于操作量大,复杂度高,如删除一个用户不仅需要删除用户表中对应记录,还需要删除和用户表关联表中对应的数据),要么批量执行,要么不执行,只有InnoDB支持呦
#!/usr/bin/env python # -*- coding: utf-8 -*- """ # # Authors: limanman # OsChina: http://xmdevops.blog.51cto.com/ # Purpose: # """ # 说明: 导入公共模块 # 说明: 导入其它模块 HOSTNAME = '127.0.0.1' USERNAME = 'flask' PASSWORD = 'flask' HOSTPORT = 3306 DATABASE = 'flask' CHARSSET = 'utf8' ALLDBURI = 'mysql://{}:{}@{}:{}/{}?charset={}'.format(USERNAME, PASSWORD, HOSTNAME, HOSTPORT, DATABASE, CHARSSET)
说明: 在运维开发中常常为了重复利用,会将一些常量存储在一个单独的PY文件中,然后引入
#!/usr/bin/env python # -*- coding: utf-8 -*- """ # # Authors: limanman # OsChina: http://xmdevops.blog.51cto.com/ # Purpose: # """ # 说明: 导入公共模块 import MySQLdb from MySQLdb.cursors import DictCursor from constants import USERNAME, PASSWORD, HOSTNAME, DATABASE, HOSTPORT # 说明: 导入其它模块 def crud(conn): with conn as cursor: cursor.execute('drop table if exists users') cursor.execute('create table users(id int primary key auto_increment, ' 'name varchar(20))') cursor.executemany('insert into users(id,name) values(null, %s)', args=[ (u'李满满',), (u'刘珍珍',) ]) cursor.execute('select * from users') rows = cursor.fetchall() print 'Ins res => {}'.format(rows) cursor.execute('update users set name=%s where id=%s', args=(u'满满李', 1)) print 'Upt res => {}'.format(cursor.rowcount) if __name__ == '__main__': # 返回元组结果集 conn = MySQLdb.connect(host=HOSTNAME, port=HOSTPORT, user=USERNAME, passwd=PASSWORD, db=DATABASE, charset='utf8') # 返回字典结果集 conn = MySQLdb.connect(host=HOSTNAME, port=HOSTPORT, user=USERNAME, passwd=PASSWORD, db=DATABASE, charset='utf8', cursorclass=DictCursor) crud(conn)
说明: 如上是运维开发中CRUD常规做法,使用with语句避免手动事务提交和回滚,其实MySQLdb.cursors支持多种返回格式,常用的就是默认的返回元组结果集,但常常为了结合JinJa2等模版系统时候最好返回的是字典形式方便处理,此时可以在创建连接对象时指定cursorclass=DictCursor也可以在代码内部重新生成一个游标对象,cursor = conn.cursor(DictCursor)就可以局部设置返回字典型结果集.