使用python連接mysql

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

 

好比:MySQL-python-1.2.5.zip

 

安裝:

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鏈接信息,將配置信息寫入字典中,後期再調用,便於擴展,以下:

 

import MySQLdb def connect_mysql(): db_config = { "host": "192.168.2.230", "port": 3306, "user": "root", "passwd": "123456", "db": "python", "charset": "utf8" } try: cnx = MySQLdb.connect(**db_config) except Exception as e: raise e return cnx
 

 

 

經常使用參數:

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:鏈接操做

 

import MySQLdb def connect_mysql(): db_config = { "host": "192.168.2.230", "port": 3306, "user": "root", "passwd": "123456", "db": "python", "charset": "utf8" } try: cnx = MySQLdb.connect(**db_config) except Exception as e: raise e return cnx if __name__ == "__main__": # __name__爲主函數 sql = "create table test(id int not null);insert into test(id) values(100);" # mysql語句 cnx = connect_mysql() # 建立mysql鏈接 cus = cnx.cursor() # 建立一個遊標對象 try: cus.execute(sql) # 執行mysql鏈接和語句 cus.close() # 關閉遊標對象 cnx.commit() # 提交事務,不然執行的語句會回滾,從而不生效 except Exception as e: # 如報錯,則拋出,並將操做回滾 raise e cnx.rollback() finally: cnx.close() # 關閉鏈接
 

 

 

結果:

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)遊標操做

 

import MySQLdb def connect_mysql(): db_config = { "host": "192.168.2.230", "port": 3306, "user": "root", "passwd": "123456", "db": "python", "charset": "utf8" } try: cnx = MySQLdb.connect(**db_config) except Exception as e: raise e return cnx if __name__ == "__main__": sql = "select * from employees;" cnx = connect_mysql() cus = cnx.cursor() try: cus.execute(sql) result1 = cus.fetchone() print("result1:") print(result1) result2 = cus.fetchmany(1) print("result2:") print(result2) result3 = cus.fetchall() print("result3:") print(result3) cus.close() cnx.commit() except Exception as e: print("error") cnx.rollback() raise e finally: cnx.close()
 

 

 

結果:

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)鏈接池操做

 

import MySQLdb from DBUtils.PooledDB import PooledDB db_config = { "host": "192.168.2.230", "port": 3306, "user": "root", "passwd": "123456", "db": "python", "charset": "utf8" } pool = PooledDB(MySQLdb, 5, **db_config) # 鏈接池最小鏈接數爲5 conn = pool.connection() # 定義一個鏈接池鏈接,方便後面調用 cur = conn.cursor() SQL = "select * from employees;" r = cur.execute(SQL) r = cur.fetchall() print(r) cur.close() conn.close()
 

 

 

結果:

((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)))

相關文章
相關標籤/搜索