暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

flask鱼书网制作十八(创建数据库)

智趣智学 2019-05-09
323

因为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的数据库。

一般做项目的套路是新建完一个数据之后,右击表新建一个表,因为我们要操作数据库首先要定义数据库的表结构,这种方法较为传统,还有一种自动创建的方法,

数据表的创建方式:

  1. Database First

手动一个个的输入字段名称类型长度等创建数据表

  1. Model First

通过模型绘制表结构,然后再使用工具转换成数据表的一种方式(数据库管理员很喜欢的一种方式)

  1. 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元》

 


文章转载自智趣智学,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论