26. Python 對 mysql 的操作
mysql數據庫現在已經成為市場占有率最高的數據庫,在開發過程中,很多情況下我們都需要操作mysql,所以對於python操作mysql的了解是必不可少的。
Python標準數據庫接口為Python DB-API, Python DB-API為開發人員提供了數據庫應用 編程接口。
參考地址:https://wiki.python.org/moin/DatabaseInterfaces,你可以查看python支持數據庫的詳細列表。
不同的數據庫需要下載不同的DB API模塊。
DB-API是一個規範。它定義了一系列必須的對象和數據庫存取方式, 以便為各種各樣的底層數據庫系統和多種多樣的數據庫接口程序提供一致的訪問接口。
Python的DB-API,為大多數的數據庫實現了接口,使用它連接各數據庫後,就可以用相同 的方式操作各數據庫。
Python DB-API使用流程:
1.引入API模塊。
2.獲取與數據庫的連接。
3.執行SQL語句和存儲過程。
4.關閉數據庫連接。
1. 安裝所需要的包
MySQLdb 是用於Python鏈接Mysql數據庫的接口,它實現了 Python 數據庫 API 規範 V2.0,基於 MySQL C API 上建立的。
如果是windows系統:登錄 https://pypi.python.org/pypi/MySQL-python/1.2.5 找到.exe結尾的包;
下載安裝就好了,然後在cmd中執行:
如果結果如上圖所示,就說明你安裝成功了,如果有如下報錯信息,
>>> import MySQLdb
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named MySQLdb
那是環境變量有問題,把安裝剛才下載的.exe包的路徑添加到環境變量中就可以了。
如果是linux系統,可以下載源碼包進行安裝:
鏈接中的zip包,然後安裝:
# yum install –y python-devel
# yum install –y mysql-devel
# yum install –y gcc
解壓:
# unzip MySQL-python-1.2.5.zip
# cd MySQL-python-1.2.5
# python setup.py build
# python setup.py install
# python
>>> import MySQLdb
2.數據庫的連接
MySQLdb提供了connect方法用來和數據庫建立連接,接收數個參數,返回連接對象:
平常我們在Mysql的數據庫中手動建立python庫的方法:
> create database python;
通過以下代碼進行python庫的連接:
conn=MySQLdb.connect(host="192.168.48.128",user="test",passwd="123456",db="python",port=3306,charset="utf8")
包含了幾種參數:
host:數據庫主機名.默認是用本地主機
user:數據庫登陸名.默認是當前用戶
passwd:數據庫登陸的秘密.默認為空
db:要使用的數據庫名.沒有默認值
port:MySQL服務使用的TCP端口.默認是3306,數字類型
charset:數據庫編碼字符集
更多參數的信息可以查這裏 http://mysql-python.sourceforge.net/MySQLdb.html
有時候,為了代碼規範,推薦把所有數據庫的配置寫在一個字典中,如下所示:
def connect_mysql(): db_config = { ‘host‘: ‘192.168.48.128‘, ‘port‘: 3306, ‘user‘: ‘xiang‘, ‘passwd‘: ‘123456‘, ‘db‘: ‘python‘, ‘charset‘: ‘utf8‘ } cnx = MySQLdb.connect(**db_config) return cnx
這樣寫的代碼更規範,即使以後數據庫有協議,只需要改動 db_config 字典中的內容就可以了,後面的內容就不用改了,增加代碼的可移植性;
也可以把 mysql 的連接包裝成一個函數,以後在連接 mysql 的時候,直接調用函數就可以了!
3.Mysql事務
了解什麽是mysql的事物
MySQL 事務主要用於處理操作量大,復雜度高的數據。比如,你操作一個數據庫,公司的一個員工離職了,你要在數據庫中刪除他的資料,也要刪除該人員相關的,比如郵箱,個人資產等。這些數據庫操作語言就構成了一個事務。在MySQL中只有使用了Innodb數據庫引擎的數據庫或表才支持事務,所以很多情況下我們都使用innodb引擎。事務處理可以用來維護數據庫的完整性,保證成批的SQL語句要麽全部執行,要麽全部不執行。
一般來說,事務是必須滿足4個條件(ACID): Atomicity(原子性)、Consistency(穩定性)、Isolation(隔離性)、Durability(可靠性)
1、事務的原子性:一組事務,要麽成功;要麽撤回。
2、穩定性 : 有非法數據(外鍵約束之類),事務撤回。
3、隔離性:事務獨立運行。一個事務處理後的結果,影響了其他事務,那麽其他事務會撤回。事務的100%隔離,需要犧牲速度。
4、可靠性:軟、硬件崩潰後,InnoDB數據表驅動會利用日誌文件重構修改。可靠性和高速度不可兼得, innodb_flush_log_at_trx_commit選項 決定什麽時候吧事務保存到日誌裏。
mysql在默認的情況下,是把每個select,insert,update,delete等做為一個事務的,登錄mysql服務器,進入mysql,執行以下命令:
mysql> show variables like ‘auto%‘;
+----------------------------------+--------+ | Variable_name | Value | +----------------------------------+--------+ | auto_increment_increment | 1 | | auto_increment_offset | 1 | | autocommit | ON | | automatic_sp_privileges | ON | +----------------------------------+--------+ 4 rows in set (0.00 sec)
如上所示:
有一個參數 autocommit 就是自動提交的意思,每執行一個msyql的 select,insert,update 等操作,就會進行自動提交。
如果把改選項關閉,我們就可以每次執行完一次代碼就需要進行手動提交,connect 對象給我們提供了兩種辦法來操作提交數據。
4. mysql事務的方法
commit():提交當前事務,如果是支持事務的數據庫執行增刪改後沒有commit則數據庫默認回滾,白操作了
rollback():取消當前事務
下面我們來看個例子:
創建一個員工表:
> create table employees (
emp_no int not null auto_increment,
emp_name varchar(16) not null,
gender enum(‘M‘, ‘F‘) not null,
hire_date date not null,
primary key (emp_no)
);
emp_no: 員工id,為主鍵且唯一
emp_name: 員工的名字
fender: 性別,只有M和F兩種選擇
hire_date: 雇傭的時間。
插入幾條數據:
> insert into employees(emp_no, emp_name, gender, hire_date) values(1001, ‘li‘, ‘M‘, ‘2015-04-01‘);
> insert into employees(emp_no, emp_name, gender, hire_date) values(1002, ‘xian‘, ‘M‘, ‘2015-04-01‘);
> insert into employees(emp_no, emp_name, gender, hire_date) values(1003, ‘sheng‘, ‘M‘, ‘2015-04-01‘);
> select * from employees;
+-----------+----------------+----------+----------------+ | emp_no | emp_name | gender | hire_date | +-----------+----------------+----------+----------------+ | 1001 | li | M | 2015-04-01 | | 1002 | xian | M | 2015-04-01 | | 1003 | sheng | M | 2015-04-01 | +-----------+----------------+----------+----------------+
通過python代碼增加一條數據到數據庫中,代碼如下:
import MySQLdb def connect_mysql(): db_config = { ‘host‘: ‘192.168.48.128‘, ‘port‘: 3306, ‘user‘: ‘xiang‘, ‘passwd‘: ‘123456‘, ‘db‘: ‘python‘, ‘charset‘: ‘utf8‘ } cnx = MySQLdb.connect(**db_config) return cnx if __name__ == ‘__main__‘: cnx = connect_mysql() cus = cnx.cursor() sql = ‘‘‘ create table test(id int not null);insert into test(id) values (100);‘‘‘ try: cus.execute(sql) cus.close() cnx.commit() except Exception as e: cnx.rollback() print(‘Error‘) # raise e finally: cnx.close()
結果返回:
Error
查看數據庫中的數據:select * from employees;
並沒有發生變化
解釋:
在我們插入數據雇傭時間字段 hire_date 的時候,故意把時間寫錯,導致異常發生,捕獲到異常之後,打印 Error,最後關閉mysql連接。
cus = cnx.cursor() 的作用是創建一個遊標對象。
本文出自 “筆記空間” 博客,請務必保留此出處http://286577399.blog.51cto.com/10467610/1983631
26. Python 對 mysql 的操作