近期工作中需要写个小脚本定期对数据库做一些处理,当然脚本是要用python写的了,然后跟数据库打交道就用了最基本的MySQLdb-python包。下面简单对MySQLdb的使用做个小结:
python支持的数据库列表
作为一款使用较普遍的开发语言,python对很多数据库接口都提供了支持,用户可以访问[Python DB-API]查看详细的数据库支持列表。
用户可以根据自己的项目需要选择合适的数据库,然后在[Python DB-API]中下载安装对应的接口插件,python对数据库的访问流程大致如下:
- 引入数据库API模块
- 获取与数据库连接
- 执行SQL语句或者存储过程
- 关闭数据库连接
常见数据库接口的接口插件下载地址如下:
python MySQL数据库接口
由于笔者使用的是MySQL数据库,所以下面主要通过笔者通过python使用MySQL来介绍整个插件安装,代码过程:
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子类。 |