简单介绍:

说明: 此模块儿主要提供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)就可以局部设置返回字典型结果集.