本章節講解Python操做數據庫,完成簡單的增刪改查工做,以MySQL數據庫爲例。python
Python的MySQL數據庫操做模塊叫MySQLdb,須要額外的安裝下。sql
經過pip工具安裝:pip install MySQLdb數據庫
MySQLdb模塊,咱們主要就用到鏈接數據庫的方法MySQLdb.Connect(),鏈接上數據庫後,再使用一些方法作相應的操做。運維
MySQLdb.Connect(parameters...)方法提供瞭如下一些經常使用的參數:ide
參數函數 |
描述工具 |
host | 數據庫地址 |
user | 數據庫用戶名, |
passwd | 數據庫密碼,默認爲空 |
db | 數據庫庫名,沒有默認庫 |
port | 數據庫端口,默認3306 |
connect_timeout | 鏈接超時時間,秒爲單位 |
use_unicode | 結果以unicode字符串返回 |
charset | 插入數據庫編碼 |
鏈接對象返回的connect()函數:fetch
commit() | 提交事務。對支持事務的數據庫和表,若是提交修改操做,不適用這個方法,則不會寫到數據庫中 |
rollback() | 事務回滾。對支持事務的數據庫和表,若是執行此方法,則回滾當前事務。在沒有commit()前提下。 |
cursor([cursorclass]) | 建立一個遊標對象。全部的sql語句的執行都要在遊標對象下進行。MySQL自己不支持遊標,MySQLdb模塊對其遊標進行了仿真。 |
遊標對象也提供了幾種方法:編碼
close() | 關閉遊標 |
execute(sql) | 執行sql語句 |
excutemany(sql) | 執行多條sql語句 |
fetchone() | 從執行結果中取第一條記錄 |
fetchmany(n) | 從執行結果中取n條記錄 |
fetchall() | 從執行結果中取全部記錄 |
scroll(self, value, mode='relative') | 遊標滾動 |
博客地址:http://lizhenliang.blog.51cto.comspa
QQ羣:323779636(Shell/Python運維開發羣)
13.1 數據庫增刪改查
13.1.1 在test庫建立一張user表,並添加一條記錄
>>> conn = MySQLdb.Connect(host='192.168.1.244',user='root',passwd='QHyCTajI',db='test',charset='utf8') >>> cursor = conn.cursor() >>> sql = "create table user(id int,name varchar(30),password varchar(30))" >>> cursor.execute(sql) # 返回的數字是影響的行數 0L >>> sql = "insert into user(id,name,password) values('1','xiaoming','123456')" >>> cursor.execute(sql) 1L >>> conn.commit() # 提交事務,寫入到數據庫 >>> cursor.execute('show tables') # 查看建立的表 1L >>> cursor.fetchall() # 返回上一個遊標執行的全部結果,默認是以元組形式返回 ((u'user',),) >>> cursor.execute('select * from user') 1L >>> cursor.fetchall() ((1L, u'xiaoming', u'123456'),)
13.1.2 插入多條數據
>>> sql = 'insert into user(id,name,password) values(%s,%s,%s)' >>> args = [('2','zhangsan','123456'), ('3','lisi','123456'),('4','wangwu','123456')] >>> cursor.executemany(sql, args) 3L >>> conn.commit() >>> sql = 'select * from user' >>> cursor.execute(sql) 4L >>> cursor.fetchall() ((1L, u'xiaoming', u'123456'), (2L, u'zhangsan', u'123456'), (3L, u'lisi', u'123456'), (4L, u'wangwu', u'123456'))
args變量是一個包含多元組的列表,每一個元組對應着每條記錄。當查詢多條記錄時,使用此方法,可有效提升插入效率。
13.1.3 刪除用戶名xiaoming的記錄
>>> sql = 'delete from user where name="xiaoming"' >>> cursor.execute(sql) 1L >>> conn.commit() >>> sql = 'select * from user' >>> cursor.execute(sql) 3L >>> cursor.fetchall() ((2L, u'zhangsan', u'123456'), (3L, u'lisi', u'123456'), (4L, u'wangwu', u'123456'))
13.1.4 查詢記錄
>>> sql = 'select * from user' >>> cursor.execute(sql) 3L >>> cursor.fetchone() # 獲取第一條記錄 (2L, u'zhangsan', u'123456') >>> sql = 'select * from user' >>> cursor.execute(sql) 3L >>> cursor.fetchmany(2) # 獲取兩條記錄 ((2L, u'zhangsan', u'123456'), (3L, u'lisi', u'123456'))
13.1.4 以字典形式返回結果
默認顯示是元組形式,要想返回字典形式,使得更易處理,就用到cursor([cursorclass])中的cusorclass參數。
傳入MySQLdb.cursors.DictCursor類:
>>> cursor = conn.cursor(MySQLdb.cursors.DictCursor) >>> sql = 'select * from user' >>> cursor.execute(sql) 3L >>> cursor.fetchall() ({'password': u'123456', 'id': 2L, 'name': u'zhangsan'}, {'password': u'123456', 'id': 3L, 'name': u'lisi'}, {'password': u'123456', 'id': 4L, 'name': u'wangwu'})
13.2 遍歷查詢結果
#!/usr/bin/env python # -*- coding: utf-8 -*- import MySQLdb try: conn = MySQLdb.Connect(host='127.0.0.1', port=3306, user='root', passwd='123456', connect_timeout=3, charset='utf8') cursor = conn.cursor() sql = "select * from user" cursor.execute(sql) for i in cursor.fetchall(): print i except Exception, e: print ("Connection Error: " + str(e)) finally: conn.close() # python test.py (2L, u'zhangsan', u'123456') (3L, u'lisi', u'123456') (4L, u'wangwu', u'123456')
使用for循環遍歷查詢結果,並增長了異常處理。