因为api对访问频率是有限制的,所以为了减少http请求发送的数量,我们在通过请求拿到数据后,将数据存入到数据库里,客户再次访问的时候优先从自己的数据库里查找
创建新的数据库:
启动XAMPP Control Panel软件,直接点击MyAQL对应的Start,这时MySQL就启动了。接着我们打开视图化管理工具navicat for MySQL,这时我们需要使用此工具连接上我们的MySQL服务,执行步骤如下:
文件—新建—MySQL
连接名:随意输入。然后点击链接测试,如果提示连接成功,就直接确定页面即可,此时我们就新建了一个链接,双击这个链接后会看见MySQL一些默认的数据库,
点击左上角的用户图标修改一下默认的root@127.0.0.1密码,因为这个密码是不能为空的,
然后我们右键链接新建一个数据库,数据库名我们就叫fisher,字符集我们选择utf8mb4 -- UTF-8 Unicode,排序规则选择utf8mb4_general_ci然后点击确定我们就创建了一个名为fisher的数据库。
一般做项目的套路是新建完一个数据之后,右击表新建一个表,因为我们要操作数据库首先要定义数据库的表结构,这种方法较为传统,还有一种自动创建的方法,
数据表的创建方式:
Database First
手动一个个的输入字段名称类型长度等创建数据表
Model First
通过模型绘制表结构,然后再使用工具转换成数据表的一种方式(数据库管理员很喜欢的一种方式)
Code First
程序员推荐使用此种方式创建数据库表结构
自动创建数据库下面的所有数据表的表结构,
新建一个模型层app/models
通过新建的一个个模型,在数据库里生成一个个的数据表,但是在模型设计的时候,一定要忘记数据库数据表的存在,设计模型的思维应该围绕着业务模型进行
我们新建一个app/models/book.py,然后在文件里定义一个类class Book():,应为每一本书都需要用一个编号,所以我们定义一个id,接着书籍需要一个名字,我们定义为title,书籍的作者我们定义为author,书籍的装帧binding,isbn,price等,
找到安装目录,启动虚拟环境pinenv shell,然后执行安装程序pipenv install flask-aqlalchemy
命令pipenv graph可以查看是否安装成功。
代码解释:
id=Column(Integer,primary_key=True,autoincrement=True)
Integer表示id是一个数字类型,premary_key=True表示id在数据库表里是一个主键,autoincrement=True表示让主键根据记录数进行自增长。
title=Column(String(50),nullable=False)
title书籍名是一个字符串,是字符串就有长度,所以我们在对象Column()内写String(50)表示字符串的最大长度是50.如果我们不希望这个title值为空,我们就要把nullable设置为False,默认情况下nullable=True,表示可以填写空值。
author=Column(String(30),default=’未名’)
作者姓名肯定是字符串,我们限定字符串的长度是30,因为这没有写nullable,所以默认值是True,default的作用是如果author为空,那么系统自动赋值该名称给author
isbn=Column(String(15),nullable=False,unique=True)
unique=True表示字段不能重复
在这里要说明的一个地方是isbn不能重复,所以我们设置了unique=True,但是id也不能重复呀,为什么没有设置?原因是这样的:因为我们使用primary_key=True将id设置为了主键,同时又使用autoincrement=True将id设置为了自增长,所以id是不可能重复的。
代码如下:
from sqlalchemy import Column,Integer,String
class Book():
id = Column(Integer,primary_key=True,autoincrement=True)
title = Column(String(50),nullable=False) #书名
author = Column(String(30),default='未名') #作者
binding = Column(String(20)) #装帧
publisher = Column(String(50)) #出版社
price = Column(String(20)) #价格
pages = Column(Integer) #页数
pubdate = Column(String(20)) #出版闵月
isbn = Column(String(15),nullable=False,unique=True)
summary = Column(String(100))#书籍简介
image = Column(String(50)) #图书的图片
将模型映射到数据库中:
要将模型映射到数据库中,我要首先要实例化一个sqlalchemy对象,与实例化flask核心对象一样,方法是我们先从flask里导入SQLALchemy这个类,然后实例化这个类:
db=SQLALchemy(),实例化这个类之后我们呀对上面的class Book()进行一些改造:
让它继承db.Model,例如class Book(db.Model)
from sqlalchemy import Column,Integer,String
fromflask_sqlalchemyimportSQLAlchemy
db = SQLAlchemy()class Book(db.Model):
id = Column(Integer,primary_key=True,autoincrement=True)
title = Column(String(50),nullable=False) #书名
author = Column(String(30),default='未名') #作者
binding = Column(String(20)) #装帧
publisher = Column(String(50)) #出版社
price = Column(String(20)) #价格
pages = Column(Integer) #页数
pubdate = Column(String(20)) #出版闵月
isbn = Column(String(15),nullable=False,unique=True)
summary = Column(String(100))#书籍简介
image = Column(String(50)) #图书的图片
另外所有的flask的相关插件,都必须和flask的核心对象app进行绑定,因此flask_aqlalchemy也要和app进行绑定。那么我们如何将db=SQLALchemy()这个核心对象与app=Flask(__name__)这个核心对象绑定呢?
还是应该在app的初始化__init__.py文件里的实例方法下进行设置。
首先我们要导入这个实例方法:from app,models.book importdb然后我们在flask实例方法下面直接db.init_app(app),此时就把两个实例方法关联起来了。几乎所有的flask插件都是这样的一种连接方式。
from flask import Flask
fromapp.models.bookimportdbdef creat_app():
app = Flask(__name__)
app.config.from_object('app.secure')
app.config.from_object('app.setting')
register_blueprint(app)
db.init_app(app)#链接两个实例
db.create_all()#调用此方法可以让db里面的模型全部映射到数据库里
return app
def register_blueprint(app):
from app.webimport web
app.register_blueprint(web)
在代码中指明数据库的链接
首先需要在项目目录下安装cymysql这个驱动:pipenv install cymysql
因为数据库的链接属于机密文件,所以我们把这个连接数据库的配置选项写到配置文件secure.py里。
SQLALCHEMY_DATABASE_URI= 'mysql+cymysql://root:ha1122@localhost:3306/fisher'
其中SQLALCHEMY_DATABASE_URI是固定写法,不能错写任何字母。等号后面的第一个参数mysql是指定的数据库,第二个cymysql是数据库驱动。后面是数据库用户名:数据库密码@数据库ip地址:端口号/URI数据库名字
完成以上步骤后,程序并不能把表映射到数据库上,修改一下这个代码db.create_all(app=app):我的理解是这样的:运行db的前提是必须要将实例化app写进来。
到此为止,视频教程是运行成功了,但是我的却报错,报错代码如下:
1045, "Access denied for user 'root'@'localhost' (using password: YES)意思是用户名上有密码,而我建立的链接qiyue里面的密码为空,所以会报错。所以需要把配置文件里面的代码修改为:
SQLALCHEMY_DATABASE_URI = 'mysql+cymysql://root:@localhost:3306/fisher'
《备注:请网友解决的,请客花了20元》




