具體使用python的DB-API,這一章裏介紹如何編寫代碼與MYSQL數據庫技術交互,這裏使用一個通用的數據庫API,名爲DB-API。html
以前咱們把日誌數據存放在一個文本文件中,沒法得知第六章最開始的請求:已經響應了多少個請求?最經常使用的字母列表是什麼?請求來自哪一個IP地址?哪一個瀏覽器用的最多?python
現使用mysql數據庫存放日誌數據: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退出
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
看到下圖的路徑說明成功:
登陸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更多知識。
使用它的好處是能夠輕鬆替換驅動程序/數據庫組合,而只對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服務器執行這個查詢,不過不會當即顯示,請求才會獲得結果。
可使用下列三個方法得到請求結果:
>>> res = cursor.fetchall()
>>> res
[('log',)]
這個結果是數據庫中的表log(只有這一個表),做爲元組去顯示()。
換一個SQL語句查詢desc log:
獲得結果中的各行:
python容許在查詢串中放置「數據佔位符」,用%s指定
數據庫系統會緩存insert,以後再一次應用所有的insert,因此有可能如今使用select查詢不到數據。須要commit提交,使用conn.commit
數據已經插入
步驟6:關閉遊標和鏈接
>>> cursor.close()
True
>>> conn.close()
調整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表中獲取數據,而不是從文件中獲取。