近期工作中需要写个小脚本定期对数据库做一些处理,当然脚本是要用python写的了,然后跟数据库打交道就用了最基本的MySQLdb-python包。下面简单对MySQLdb的使用做个小结:

python支持的数据库列表

作为一款使用较普遍的开发语言,python对很多数据库接口都提供了支持,用户可以访问[Python DB-API]查看详细的数据库支持列表。

用户可以根据自己的项目需要选择合适的数据库,然后在[Python DB-API]中下载安装对应的接口插件,python对数据库的访问流程大致如下:

  • 引入数据库API模块
  • 获取与数据库连接
  • 执行SQL语句或者存储过程
  • 关闭数据库连接

常见数据库接口的接口插件下载地址如下:

python MySQL数据库接口

由于笔者使用的是MySQL数据库,所以下面主要通过笔者通过python使用MySQL来介绍整个插件安装,代码过程:

阿里云-推广AD

1.安装Python MySQL数据库接口插件

如前文介绍,在MySQL上下载对应操作系统(Windows\Ubuntu等)、Python版本(2.7\3.3等)、对应操作系统位数(x86\x64等)的数据库接口安装版本,按照步骤安装完成即可。

版本选择

下载MySQL-python插件:

尤其windows 64位的,找了半天终于找到这里了:http://www.codegood.com/downloads

2.编写Python代码操作数据库

一般下载插件的网站上都会提供用户使用手册,开始写自己的代码前可以先读一下官方提供的代码样例:

代码样例
  • 连接数据库:
import mysql.connector
cnx = mysql.connector.connect(user='scott', password='tiger',
                              host='127.0.0.1',
                              database='employees')
cnx.close()
  • 数据库操作:
#-*-coding:utf-8-*-
'''
Created on 2016年12月15日
@author: Eldon
'''
from mysql import connector as sql_conn
from mysql.connector import errorcode
class MySQL(object):
    '''
    classdocs
    '''
    CONN_PARAMS = {
    'user': 'root',
    'password': 'root',
    'host': 'localhost',
    'database': '',
    'raise_on_warnings': 'True',
    }
    DATABASE_NAME = 'eldon'
    DB_TABLES = {}
    DB_TABLES['test'] = (
        '''
        CRATE TABLE `test` (
            `param1` int(11) NOT NULL AUTO_INCREMENT,
            `param2` varchar(11) NOT NULL,
            `param3` enum('M', 'F') NOT NULL,
            `param4` date,
            PRIMARY KEY (col1)
        ) ENGINE=InnoDB
        '''
    )
    INSERT_DDL = (test_insert,) = (("INSERT INTO test (param1, param2, param3, param4) VALUES (%s, %s, %s, %s)"),)
    QUERY_DDL = (test_query,) = (("SELECT * FROM test"),)
    QUERY_DDL = (test_delete,) = (("DELETE FROM test"),)
    def __init__(self, params):
        '''
        Constructor
        '''
        self.conn = sql_conn.connect(**self.CONN_PARAMS)
        self.curs = self.conn.cursor
    def __del__(self):
        if self.conn:
            self.conn.close()
    def create_database(self):
        try:
            self.curs.database = self.DATABASE_NAME
        except sql_conn.Error as err:
            if errorcode.ER_BAD_DB_ERROR == err.errno:
                try:
                    self.curs.execute("CREATE DATABASE {} DEFAULT CHARACTER SET 'utf-8'".format(self.DATABASE_NAME))
                    self.curs.database = self.DATABASE_NAME
                except sql_conn.Error as ex:
                    print "Failed creating database: {}".format(ex)
                    self.conn.close()
                    exit(1)
            else:
                print "get database failed: {}".format(err)
                self.conn.close()
                exit(1)
    def create_table(self):
        for name, ddl in self.DB_TABLES.iteritems():
            try:
                print "Creating table {}:".format(name)
                self.curs.execute(ddl)
            except sql_conn.Error as err:
                if errorcode.ER_TABLE_EXISTS_ERROR == err.errno:
                    print "Table {} already exists.".format(name)
                else:
                    print "Create table {} success.".format(name)
            else:
                print "OK"
    def insert_record(self, table_name, *column):
        self.curs.execute(self["%s_insert" % table_name], column)
        self.conn.commit()
    def query_record(self, table_name):
        self.curs.execute(self["%s_query" % table_name])
        for record in self.curs:
            print record
    def delete_record(self, table_name):
        try:
            self.curs.execute(self["%s_delete" % table_name])
        except Exception as ex:
            print "Delete {} record faild: {}".format(table_name, ex)
            self.conn.rollback()
  • 异常处理
    Python DB API中常见的错误类型如下:
异常 描述
Warning 当有严重警告时触发,例如插入数据被截断等,是StandardError的子类
Error 警告意外其他所有错误类,是StandardError的子类
InterfaceError 数据接口本身错误触发,是Error子类
DatabaseError 数据库有关的错误触发,是Error子类
DataError 数据处理发生错误时触发(除零错误、数据超范围等),是DatabaseError子类
OperationError 非用户控制的操作数据库时发生的错误(连接意外断开、数据库名未找到、事务处理失败、内存分配错误等),是DatabaseError子类
IntegrityError 完整性相关的错误(外键检查失败等),是DatabaseError子类
InternalError 数据库内部错误(游标失效、事务同步失败等),是DatabaseError子类
Paramgramming 程序错误(数据表没找到\已存在、SQL语法错误、参数数量错误等),是DatabaseError子类
NotSupportedError 不支持错误,使用了数据库不支持的函数或者API等(使用.rollback()但是数据库不支持事务),是DatabaseError子类。

参考资料: