python中web應用與mysql數據庫交互

7使用數據庫

具體使用python的DB-API,這一章裏介紹如何編寫代碼與MYSQL數據庫技術交互,這裏使用一個通用的數據庫API,名爲DB-API。html

7.1基於數據庫的web應用

以前咱們把日誌數據存放在一個文本文件中,沒法得知第六章最開始的請求:已經響應了多少個請求?最經常使用的字母列表是什麼?請求來自哪一個IP地址?哪一個瀏覽器用的最多?python

現使用mysql數據庫存放日誌數據:mysql

  1. 安裝mysql服務器。
  2. 爲Python安裝一個mysql數據庫驅動程序。
  3. 爲web應用建立數據庫和表。
  4. 建立代碼來處理這個web應用的數據庫和表。

任務1:安裝mysql服務器。

網站:http://dev.mysql.com/downloads/mysql/web

千萬不要選擇最新版本的8.0.12我整了一下午的教訓,grant按照正常方式建立用戶會一直報語法錯誤。sql

問了老師說多是版本的緣由,建議下載5.6版,雷區我已經踩了數據庫

即便你沒有用過mysql,不過不要緊,我也接觸較少(我主要對oracle瞭解多一些)編程

下載以後發現是一個zip文件,這是個人解壓路徑:瀏覽器

D:\mysql\mysql-5.6.41-winx64緩存

安裝步驟:http://www.javashuo.com/article/p-fgodgcke-bb.html服務器

安裝完成以後mysql -uroot -p新密碼(個人密碼是112233)

就進入了mysql>  quit退出

任務2:爲Python安裝一個mysql數據庫驅動程序。

python解釋器對於數據庫提供了一個標準數據庫API(應用編程接口),稱爲DB-API,能夠用來處理基於SQL的數據庫,還須要一個用來鏈接DB-API的驅動程序——oracle提供了一個MYSQL-Connector/python驅動。下來手動安裝這個驅動,訪問https://dev.mysql.com/downloads/connector/python/

在這個頁面選擇以前的版本最少是2.1.3,將下拉選項改成Platform Independent(平臺獨立):

 

下載以後解壓,而後使用管理員打開cmd切換到這個目錄下輸入

py -3 setup.py install

看到下圖的路徑說明成功:

 

任務3:爲web應用建立數據庫和表

登陸mysql:

mysql -u root -p112233

建立一個數據庫存儲日誌數據:

create database vsearchlogDB;

下來專門爲web應用建立一個數據庫用戶的ID和口令,以便在於mysql交互時使用,而不是一直使用根用戶root。

grant all on vsearchlogDB.* to 'vsearch' identified by '112233';

退出:quit

 

建立一個表,字段:短語,字母,IP地址,瀏覽器以及結果值,還須要每一個請求的惟一ID和記錄消息的時間戳。

用vsearch用戶登陸數據庫

mysql -u vsearch -p 112233

我遇到了一個問題,登陸不上去,報錯error 1045 access denied for user

因此分享一個解決的方案

http://www.javashuo.com/article/p-qycpvspo-eg.html

 

使用建立的數據庫

use vsearchlogdb

建立表

create table log(

id int auto_increment primary key,

ts timestamp default current_timestamp,

phrase varchar(128) not null,

letters varchar(32) not null,

ip varchar(16) not null,

browser_string varchar(256) not null,

results varchar(64) not null);

查看錶的結構

desc log;

 

爲了讓日誌的記錄自動加入到這個表中,而不是咱們輸入insert命令一行一行的插入數據,須要在Python和SQL進行交互,相應的用到DB-API更多知識。

DB-API

使用它的好處是能夠輕鬆替換驅動程序/數據庫組合,而只對Python代碼進行很是小的改動。

 

步驟1:定義鏈接屬性

鏈接到mysql須要三個信息:

  l 運行mysql服務器的計算機主機的IP地址/主機名;

  l 用戶ID和口令;

  l 這個用戶想要交互的數據庫名。

驅動程序容許將這些連接屬性放在一個Python字典中,下來在>>>窗口進行測試

dbconfig = { 'host': '127.0.0.1',

      'user': 'vsearch',

       'password': '112233',

      'database':'vsearchlogdb', }

 

步驟2:導入數據庫驅動程序

>>> import mysql.connector

導入以後就可使用mysql特定的驅動程序了

 

步驟3:創建與服務器的一個鏈接

>>> conn = mysql.connector.connect(**dbconfig)

**告訴connect函數用一個變量提供了一個參數字典,在connect函數中使用這些參數來創建鏈接。

 

步驟4:打開一個遊標

把遊標理解爲數據庫中的文件句柄。

>>> cursor = conn.cursor()

 

步驟5:完成SQL查詢

首先向mysql請求鏈接數據庫的表名,將show tables查詢賦至_SQL變量(變量名可使用別的),而後調用cursor.execute函數,並傳入_SQL做爲參數:

>>> _SQL = """show tables"""

>>> cursor.execute(_SQL)

執行後SQL查詢會發送到SQL服務器執行這個查詢,不過不會當即顯示,請求才會獲得結果。

可使用下列三個方法得到請求結果:

  •    cursor.fetchone獲取一行結果。
  •    cursor.fetchmany獲取指定的任意行結果。
  •    cursor.fetchall獲取全部數據行結果。

 

>>> res = cursor.fetchall()

>>> res

[('log',)]

這個結果是數據庫中的表log(只有這一個表),做爲元組去顯示()。

換一個SQL語句查詢desc log:

 

獲得結果中的各行:

 

python容許在查詢串中放置「數據佔位符」,用%s指定

 

數據庫系統會緩存insert,以後再一次應用所有的insert,因此有可能如今使用select查詢不到數據。須要commit提交,使用conn.commit

 

數據已經插入

 

步驟6:關閉遊標和鏈接

>>> cursor.close()

True

>>> conn.close()

任務4:建立代碼處理web應用的數據庫和表

調整web應用的代碼,讓它把web請求的數據記錄到mysql數據庫系統中。

 

def log_request(req: 'falsk請求', res: str) -> None:
	dbconfig = { 'host': '127.0.0.1',
				'user': 'vsearch',
			 	'password': '112233',
		 		'database':'vsearchlogdb', }
	import mysql.connector
	conn = mysql.connector.connect(**dbconfig)
	cursor = conn.cursor()
	_SQL = """ insert into log 
			(phrase, letters, ip, browser_string, results)
	 		values 
	 		(%s, %s, %s, %s, %s)"""
	cursor.execute(_SQL, (req.form['phrase'], 
						  req.form['letters'], 
						  req.remote_addr, 
						  req.user_agent.browser, 
						  res, ))
	conn.commit()
	cursor.close()
	conn.close()

測試新的代碼

py -3 vsearch_for_web.py

打開瀏覽器輸入http://127.0.0.1:5000像以前同樣測試

不過此次/viewlog不能查看最新的日誌記錄,如今的數據在數據庫中。

 

窗口的大小在菜單欄右鍵屬性中調整。

 

這一部分的內容已經完成了,不過別忘了函數view_the_log,後面會更新這個函數讓它從數據庫的log表中獲取數據,而不是從文件中獲取。

相關文章
相關標籤/搜索