zoukankan      html  css  js  c++  java
  • python中web应用与mysql数据库交互

    7使用数据库

    具体使用python的DB-API,这一章里介绍如何编写代码与MYSQL数据库技术交互,这里使用一个通用的数据库API,名为DB-API。

    7.1基于数据库的web应用

    之前我们把日志数据存放在一个文本文件中,无法得知第六章最开始的请求:已经响应了多少个请求?最常用的字母列表是什么?请求来自哪个IP地址?哪个浏览器用的最多?

    现使用mysql数据库存放日志数据:

    1. 安装mysql服务器。
    2. 为Python安装一个mysql数据库驱动程序。
    3. 为web应用创建数据库和表。
    4. 创建代码来处理这个web应用的数据库和表。

    任务1:安装mysql服务器。

    网站:http://dev.mysql.com/downloads/mysql/

    千万不要选择最新版本的8.0.12我整了一下午的教训,grant按照正常方式创建用户会一直报语法错误。

    问了老师说可能是版本的原因,建议下载5.6版,雷区我已经踩了

    即使你没有用过mysql,不过没关系,我也接触较少(我主要对oracle了解多一些)

    下载之后发现是一个zip文件,这是我的解压路径:

    D:mysqlmysql-5.6.41-winx64

    安装步骤:https://blog.csdn.net/u012896719/article/details/80428493

    安装完成之后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

    所以分享一个解决的方案

    https://www.cnblogs.com/summertime-wu/p/7466160.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表中获取数据,而不是从文件中获取。

  • 相关阅读:
    hdu_6836 Expectation
    hdu_6820 Tree
    luogu P1039 侦探推理
    自己动手实现区块链
    第六章 钱包管理界面和区块链浏览器
    第五章 自己动手写比特币之交易中继
    第四章 自己动手写比特币之钱包
    第三章 自己动手写区块链之交易
    第二章 工作量证明和挖矿
    第一章:最小可行区块链
  • 原文地址:https://www.cnblogs.com/sebastiane-root/p/9566494.html
Copyright © 2011-2022 走看看