Python DB-API使用流程:python
引入API模塊mysql
獲取與數據庫的鏈接sql
執行SQL語句和存儲過程數據庫
關閉數據庫鏈接windows
1、接口包安裝安全
1)windows環境ide
下載地址:https://pypi.python.org/pypi/MySQL-python/1.2.5函數
好比:MySQL-python-1.2.5.win32-py2.7.exe性能
安裝完畢以後查看接口目錄:fetch
注:在導入模塊時,若是報錯,則須要加一下系統環境變量
2)Linux環境
×××地址:https://pypi.python.org/pypi/MySQL-python/1.2.5
安裝:
yum install -y python-devel mysql-devel gcc
unzip MySQL-python-1.2.5.zip
cd MySQL-python-1.2.5
python setup.py build & python setup.py install
2、鏈接數據庫
1)首先給mysql建庫、受權
create database python;
grant all privileges on *.* to 'root'@'%' identified by '123456';
flush privileges;
2)定義鏈接方法
MySQLdb提供了與數據庫的鏈接方法,以下:
conn=MySQLdb.connect(host="192.168.2.230",user="root",passwd="123456",db="python",charset="utf8")
爲了規範代碼,先定義mysql鏈接信息,將配置信息寫入字典中,後期再調用,便於擴展,以下:
經常使用參數:
host: 數據庫主機名,默認爲本地主機
user: 數據庫登錄名,默認爲當前用戶
passwd: 數據庫登錄的祕密,默認爲空
db: 數據庫名,無默認值
port: 數據庫端口,默認是3306,數字類型
charset: 數據庫編碼
3、mysql事務
MySQL中,Innodb引擎的數據庫或表才支持事務,它用來維護數據庫的完整性,保證成批的SQL語句要麼所有執行,要麼所有不執行
事務必須知足的4個條件:
1)原子性:一組事務,要麼成功,要麼撤回
2)穩定性:有非法數據(外鍵約束之類),事務撤回
3)隔離性:事務獨立運行。一個事務處理後的結果,影響了其餘事務,那麼其餘事務會撤回。事務的100% 隔離,須要犧牲速度
4)可靠性:軟、硬件崩潰後,InnoDB數據表驅動會利用日誌文件重構修改。可靠性和高速度不可兼得, innodb_flush_log_at_trx_commit選項決定把事務保存到日誌裏的時間
1)查看事務自動提交是否開啓,默認開啓
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.01 sec)
注:autocommit,即開啓自動提交;如關閉則每次執行select、insert、date、delete,都需手動提交
2)mysql事務的方法
commit(): 提交當前事務,若是支持事務的數據庫執行了增刪改後,沒有commit則數據庫,則默認回滾
rollback(): 取消當前事務
4、遊標
遊標是系統爲用戶開設的一個數據緩衝區,存放SQL語句的執行結果。用戶使用SQL語句逐一從遊標中獲取記錄,賦給主變量,交由python進一步處理,一組主變量一次只能存放一條記錄。
特色:
提供了一種對錶中檢索出的數據進行操做的靈活手段
老是與一條SQL 選擇語句相關聯,由於它由結果集和結果集中指向特定記錄的遊標位置組成
當決定對結果集進行處理時,必須聲明一個指向該結果集的遊標
經常使用方法:
cursor(): 建立遊標對象
close(): 關閉遊標對象
fetchone(): 獲得結果集的下一行
fetchmany([size = cursor.arraysize]): 獲得結果集的下幾行
fetchall(): 獲得結果集中剩下的全部行
excute(sql[, args]): 執行一個數據庫查詢或命令
executemany (sql, args): 執行多個數據庫查詢或命令
5、mysql操做數據
例子1:鏈接操做
結果:
mysql> show tables;
+------------------+
| Tables_in_python |
+------------------+
| test |
+------------------+
1 row in set (0.00 sec)
mysql> select * from test;
+-----+
| id |
+-----+
| 100 |
+-----+
1 row in set (0.08 sec)
例子2:遊標操做
1)建立數據表employees
use python
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)
);
2)插入數據
insert into employees(emp_no, emp_name, gender, hire_date) values(01, 'huangzhenping', 'M', '2017-11-21');
insert into employees(emp_no, emp_name, gender, hire_date) values(02, 'zhaoxiang', 'M', '2016-11-10');
insert into employees(emp_no, emp_name, gender, hire_date) values(03, 'lichao', 'M', '2016-08-20');
3)查看數據
mysql> select * from employees;
+--------+---------------+--------+------------+
| emp_no | emp_name | gender | hire_date |
+--------+---------------+--------+------------+
| 1 | huangzhenping | M | 2017-11-21 |
| 2 | zhaoxiang | M | 2016-11-10 |
| 3 | lichao | M | 2016-08-20 |
+--------+---------------+--------+------------+
3 rows in set (0.00 sec)
4)遊標操做
結果:
result1:
(1L, u'huangzhenping', u'M', datetime.date(2017, 11, 21))
result2:
((2L, u'zhaoxiang', u'M', datetime.date(2016, 11, 10)),)
result3:
((3L, u'lichao', u'M', datetime.date(2016, 8, 20)),)
6、mysql鏈接池
每次鏈接mysql數據庫請求時,都是獨立的去請求訪問,至關浪費資源,並且訪問數量達到必定數量時,對mysql的性能會產生較大的影響。所以,實際使用中,一般會使用數據庫的鏈接池技術,來訪問數據庫達到資源複用的目的
python的數據庫鏈接池包 DBUtils:
DBUtils是一套Python數據庫鏈接池包,並容許對非線程安全的數據庫接口進行線程安全包裝。
DBUtils提供兩種外部接口:
* PersistentDB :提供線程專用的數據庫鏈接,並自動管理鏈接。
* PooledDB :提供線程間可共享的數據庫鏈接,並自動管理鏈接。
1)下載接口包
下載地址:https://pypi.python.org/pypi/DBUtils/
如:DBUtils-1.2.tar.gz
2)安裝
tar -zxvf DBUtils-1.2.tar.gz
cd DBUtils-1.2
python setup.py install
注: 或者 pip install DBUtils安裝
3)鏈接池操做
結果:
((1L, u'huangzhenping', u'M', datetime.date(2017, 11, 21)), (2L, u'zhaoxiang', u'M', datetime.date(2016, 11, 10)), (3L, u'lichao', u'M', datetime.date(2016, 8, 20)))