近期工作中需要寫個小腳本定期對數據庫做一些處理,當然腳本是要用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子類。 |