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

python中web应用与mysql数据库交互的更多相关文章

  1. 48.Python中ORM模型实现mysql数据库基本的增删改查操作

    首先需要配置settings.py文件中的DATABASES与数据库的连接信息, DATABASES = { 'default': { 'ENGINE': 'django.db.backends.my ...

  2. android开发 如何通过web服务器访问MYSQL数据库并且使其数据同步到android SQLite数据库?

    通过web服务器访问MYSQL数据库有以下几个过程: 1.在MySql下创建自己的数据库和自己的表单 2.连接数据库. 3.访问数据库 1.创建web工程 (服务器端) 在Myeclipse下新建一个 ...

  3. linux自动定时备份web程序和mysql数据库

    前些天受朋友说linux定时备份不知道怎么搞,叫帮忙处理一下.由于这段时间正闲着,所以也就欣然答应.由于朋友对linux不懂也希望我将操作的过程记录下来,也就是越详细越好.所以写得比较$%^& ...

  4. 在Eclipse中使用JDBC访问MySQL数据库的配置方法

    在Eclipse中使用JDBC访问MySQL数据库的配置方法 分类: DATABASE 数据结构与算法2009-10-10 16:37 5313人阅读 评论(10) 收藏 举报 jdbcmysql数据 ...

  5. Python搭建Web服务器,与Ajax交互,接收处理Get和Post请求的简易结构

    用python搭建web服务器,与ajax交互,接收处理Get和Post请求:简单实用,没有用框架,适用于简单需求,更多功能可进行扩展. python有自带模块BaseHTTPServer.CGIHT ...

  6. Java Web工程连接MySQL数据库及Tomcat服务器页面中文乱码

    Java Web工程连接MySQL数据库 一. 准备工作 1.下载连接MySQL数据库的JDBC (可以去官网下,也可以去百度云找) 2.将下载的jar文件复制到Tomcat的lib目录下 3.新建一 ...

  7. shell编程系列22--shell操作数据库实战之shell脚本与MySQL数据库交互(增删改查)

    shell编程系列22--shell操作数据库实战之shell脚本与MySQL数据库交互(增删改查) Shell脚本与MySQL数据库交互(增删改查) # 环境准备:安装mariadb 数据库 [ro ...

  8. python web.py操作mysql数据库,实现对数据库的增删改查操作

    使用web.py框架,实现对mysql数据库的增删改查操作: 该示例代码中连接的是本地数据库testdb,user表,表结构比较简单,只有两个字段:mobile和passwd,类型均为字符型 实际应用 ...

  9. 使用python读取配置文件并从mysql数据库中获取数据进行传参(基于Httprunner)

    最近在使用httprunner进行接口测试,在传参时,用到了三种方法:(1)从csv文件中获取:(2)在config中声名然后进行引用:(3)从函数中获取.在测试过程中,往往有些参数是需要从数据库中获 ...

随机推荐

  1. IIS : Add the server variable name to the allowed server variable list.

    IIS下设置反向代理访问时报错:将服务器变量名添加到允许的服务器变量列表中. 1.打开IIS: 2.打开要添加变量的站点: 3.打开URL Rewrite: 4.在右列上,选择“查看服务器变量(Vie ...

  2. eoLinker-AMS接口管理系统

    多端阅读<eoLinker-AMS接口管理系统>: 在PC/MAC上查看:下载w3cschool客户端,进入客户端后通过搜索当前教程手册的名称并下载,就可以查看当前离线教程文档.下载eoL ...

  3. 基于easyui开发Web版Activiti流程定制器详解(三)——页面结构(上)

    上一篇介绍了定制器相关的文件,这篇我们来看看整个定制器的界面部分,了解了页面结构有助于更好的理解定制器的实现,那么现在开始吧! 首先,我们来看看整体的结构: 整体结构比较简单,主要包括三个部分: 1. ...

  4. c# datetime用法总结

    备忘:YYYY-mm-dd HH:MM:SS部分解释 d 月中的某一天.一位数的日期没有前导零. dd 月中的某一天.一位数的日期有一个前导零. ddd 周中某天的缩写名称,在 Abbreviated ...

  5. 使用yii的layout,加入<?php echo $content; ?>这句话时,它会自动在子页面上面添加一个div包裹

    使用yii的layout,加入<?php echo $content; ?>这句话时,它会自动在子页面上面添加一个div包裹,而且div的id命名为id=content,这个和已有id重复 ...

  6. 根据经纬度获取位置描述:百度API与高德API的区别

    百度API 使用百度坐标 1.访问方式一 http://api.map.baidu.com/geocoder/v2/?location=35.063592,118.38513&output=j ...

  7. PAT乙级1016

    1016 部分A+B (15 分)   正整数 A 的“D​A​​(为 1 位整数)部分”定义为由 A 中所有 D​A​​ 组成的新整数 P​A​​.例如:给定 A=3862767,D​A​​=6,则 ...

  8. 微信授权获取用户openid前端实现

    近来,倒霉的后台跟我说让我拿个openid做微信支付使用,寻思很简单,开始干活.   首先引导用户打开如下链接,只需要将appid修改为自己的就可以,redirect_url写你的重定向url   h ...

  9. nagios client 端的安装配置 以及 svr端对应的配置(转)

    1.下载安装包并解压 $ wget wget http://www.nagios-plugins.org/download/nagios-plugins-2.1.1.tar.gz$ wget http ...

  10. 通过ReentrantLock简单了解下并发包中的锁

    ReentrantLock在进行实例化时,可以通过构造函数的参数选择是否使用公平锁FairSync或者非公平锁NonfairSync,两者的区别比较简单,如果是公平锁则新来的线程会先检测同步队列中是否 ...