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表中获取数据,而不是从文件中获取。

相关文章
相关标签/搜索