FLASK博客系列6——数据库之谜

       我们上一篇已经实现了简易博客界面,你还记得我们的博客数据是自己手动写的吗?但实际应用中,我们是不可能这样做的。大部分程序都需要保存数据,所以不可避免要使用数据库。我们这里为了简单方便快捷,使用了超级经典的SQLite,它是一种基于文件,不需要启动后台服务的数据库。当然了,仅限于操作简单,访问量比较低的应用中使用,这也正是我们选用它的原因。

    SQLAlchemy——python数据库工具

       SQLAlchemy是python下的一个数据库工具,它提供了SQL工具包及对象关系映射(ORM)工具。你可以通过定义python类来表示数据库中的一张表,然后通过这个类来进行各种操作,从而代替书写SQL语句,而这个类我们称之为模型类

       但是,我们今天用另一个包——Flask-SQLAlchemy。它是一个简化了SQLAlchemy 操作的flask扩展,是SQLAlchemy的具体实现,封装了对数据库的基本操作。简而言之,可以更快更方便地帮助我们去构建博客,而不用细致去深究其原理。等以后有时间了我们另开一篇,讲讲SQLAlchemy的操作。

       先把包装一下。

pip3 install flask-sqlalchemy

       接着初始化一下,将其跟flask关联起来。

import os
from flask_sqlalchemy import SQLAlchemy  # 导入扩展类basedir = os.path.abspath(os.path.dirname(__file__))  # 绝对路径
app = Flask(__name__)app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + os.path.join(basedir, 'blog.db')
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = Falsedb = SQLAlchemy(app)  # 初始化扩展,传入程序实例 app

       接着我们在pycharm打开控制台,创建数据库:

>>> from app import db
>>> db.create_all()

       然后在当前目录下我们可以看到生成了blog.db。是不是很简单呢?但这种方式会有问题,因为采用db.create_all在后期修改字段的时候,不会自动的映射到数据库中,必须删除表,然后重新运行db.create_all才会重新映射,这样不符合实际的工作要求。因此flask-migrate就是为了解决这个问题,它可以在每次修改模型后,可以将修改的东西映射到数据库中。

  Flask-Migrate

       使用flask_migrate必须借助flask_scripts那么flask-script的作用是什么呢?flask-script的作用是可以通过命令行的形式来操作Flask。例如通过命令跑一个开发版本的服务器、设置数据库,定时任务等。

       老样子,动手装包:

pip install Flask-Script

       如果用过django的同学都知道,操作很多命令都是通过python manager.py + 命令 来实现的。那我们也来模仿一番。

       我们来定义下命令:

  • python manage.py db init:初始化一个迁移脚本的环境,只需要执行一次,实际就是db.create_all()
  • python manage.py db migrate将模型生成迁移文件,只要模型更改了,就执行一遍这个命令。
  • python manage.py db upgrade:将迁移文件真正映射到数据库中,每次运行migrate命令后,记得要运行这个命令。

       我们接着新建一个models.py,用来定义模型类。定义一下User类和Article类。

from app import dbclass User(db.Model):  # 表名将会是 user(自动生成,小写处理)id = db.Column(db.Integer, primary_key=True, autoincrement=True)  # 主键name = db.Column(db.String(20))  # 用户名class Article(db.Model):  # 表名将会是 user(自动生成,小写处理)# id 主键 自增id = db.Column(db.Integer, primary_key=True, autoincrement=True)# 文章标题 非空title = db.Column(db.String(100), nullable=False)# 文章正文 非空content = db.Column(db.Text, nullable=False)# 关联表,这里要与相关联的表的类型一致, user.id 表示关联到user表下的id字段author_id = db.Column(db.Integer, db.ForeignKey('user.id'))# 给这个article模型添加一个author属性(关系表),User为要连接的表,backref为定义反向引用# lazy表示禁止自动查询,后面可以直接操作这个对象。只可以用在一对多和多对多关系中,不可以用在一对一和多对一中author = db.relationship('User', backref=db.backref('articles'), lazy='dynamic')

        我们新建一个manage.py。

       manage.py

from flask_script import Manager
from flask_migrate import Migrate, MigrateCommand
from app import app, db
from models import User, Articlemanager = Manager(app)# 1. 要使用flask_migrate,必须绑定app和db
migrate = Migrate(app, db)
# 2. 把MigrateCommand命令添加到manager中
manager.add_command('db', MigrateCommand)if __name__ == '__main__':manager.run()

        把上面生成的blog.db删除,在命令行中执行 python manage.py db init。同样的,生成了blog.db。同时在我们的项目中会生成一个migrations文件夹,其中versions中没有任何内容。如下图:

       

        然后我们开始迁移数据库。上面的命令成功后,执行如下命令,将模型生成迁移文件。

python manage.py db migrate

        如下所示,versions文件夹中生成了一个文件88ae96b5a85e_.py。

        这个就是迁移文件了。我们打开来看看里面是什么。

"""empty messageRevision ID: 88ae96b5a85e
Revises: 
Create Date: 2020-05-24 19:51:53.279700"""
from alembic import op
import sqlalchemy as sa# revision identifiers, used by Alembic.
revision = '88ae96b5a85e'
down_revision = None
branch_labels = None
depends_on = Nonedef upgrade():# ### commands auto generated by Alembic - please adjust! ###op.create_table('user',sa.Column('id', sa.Integer(), autoincrement=True, nullable=False),sa.Column('name', sa.String(length=20), nullable=True),sa.PrimaryKeyConstraint('id'))op.create_table('article',sa.Column('id', sa.Integer(), autoincrement=True, nullable=False),sa.Column('title', sa.String(length=100), nullable=False),sa.Column('content', sa.Text(), nullable=False),sa.Column('author_id', sa.Integer(), nullable=True),sa.ForeignKeyConstraint(['author_id'], ['user.id'], ),sa.PrimaryKeyConstraint('id'))# ### end Alembic commands ###def downgrade():# ### commands auto generated by Alembic - please adjust! ###op.drop_table('article')op.drop_table('user')# ### end Alembic commands ###

        这就是ORM能够帮我们操作数据库的秘密,emmmm。这时候你的数据库里是还没有创建表的。必须执行下面的语句。

python manage.py db upgrade

        我们借助pycharm来查看下创建的表结构是不是跟我们预期的一样。

        奈斯,一模一样。

        好啦,至此我们的数据库部分就完成了创建,下一节我们将会介绍如何去插入数据并展示在我们的博客中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/175265.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

​无人机石油管道巡检方案新亮点:灵活准确又高效

在当前石油工业的安全管理中,无人机技术逐渐成为一种不可或缺的工具。随着我国油气管道里程的持续增长,确保这些关键基础设施的安全运行变得越来越重要。传统的巡检方法已经无法满足现代油气行业的需求,而无人机石油管道巡检技术的应用提供了…

目标检测YOLO实战应用案例100讲-基于改进YOLO深度学习模型的烟支外观质量检测(续)

目录 基于YOLOv5烟支外观缺陷检测研究 4.1本章引言 4.2YOLOv5s模型 4.2.1 输入端 4.2.2 Backbone部分

【LeeCode】*76. 最小覆盖子串

给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 "" 。 注意: 对于 t 中重复字符,我们寻找的子字符串中该字符数量必须不少于 t 中该字符数量。 如…

2023.11.27如何使用内网穿透工具实现Java远程连接操作本地Elasticsearch搜索引擎

文章目录 前言1. Windows 安装 Cpolar2. 创建Elasticsearch公网连接地址3. 远程连接Elasticsearch4. 设置固定二级子域名 前言 简单几步,结合Cpolar内网穿透工具实现Java远程连接操作本地Elasticsearch。 什么是elasticsearch?一个开源的分布式搜索引擎&#xff0…

解决:AttributeError: module ‘os’ has no attribute ‘mknod’

解决:AttributeError: module ‘os’ has no attribute ‘mknod’ 文章目录 解决:AttributeError: module os has no attribute mknod背景报错问题报错翻译报错位置代码报错原因解决方法今天的分享就到此结束了 背景 在使用之前的代码时,报错…

element table滚动条失效

问题描述:给el-table限制高度之后滚动条没了 给看看咋设置的&#xff1a; <el-table:data"tableData"style"width: 100%;"ref"table"max-height"400"sort-change"changeSort">对比了老半天找不出问题&#xff0c;最后…

sizeHint() 是一个用于获取部件(widget)的建议大小的函数,它是在许多 GUI 框架中都存在的常见函数之一

sizeHint() 是一个用于获取部件&#xff08;widget&#xff09;的建议大小的函数&#xff0c;它是在许多 GUI 框架中都存在的常见函数之一。 具体来说&#xff0c;sizeHint() 函数用于返回部件在没有特定约束条件时所建议的最佳尺寸。这个建议的尺寸通常基于部件的内容、布局和…

使用opencv的matchTemplate进行银行卡卡号识别

![字体文件](https://img-blog.csdnimg.cn/3a16c87cf4d34aceb0778c4b20ddadb2.png#pic_center import cv2 import numpy as npdef show_img(img, name"temp"):img cv2.resize(img, (0, 0), fx3, fy3)cv2.imshow(name, img)cv2.waitKey(0)cv2.destroyAllWindows()de…

sed笔记231127

-e基本正则,-E扩展版正则 -E, -r, --regexp-extended 在脚本中使用扩展正则表达式&#xff08;为保证可移植性使用 POSIX -E&#xff09;。-e或 --expression 接基本正则表达式, 可多次使用,多次过滤-f 或 --file 选项接脚本文件, 注意是脚本文件, 而不是输入文件 -e可以不写…

excel单元格内换行按什么快捷键

如果我们使用excel软件的时候&#xff0c;因为一些日常的操作太过繁琐想要简化自己的操作步骤的话&#xff0c;其实是有很多快捷方式在其中的。那么对excel单元格内换行按什么快捷键这个问题&#xff0c;据小编所知我们可以在表格中使用Alt Enter来进行换行。详细内容就来看下…

C语言入门---位操作

目录 1. 两个数不同的二进制位个数 2.原码、反码、补码 3.不创建临时变量实现两个数的交换 4.求一个整数存储在内存中的二进制中1的个数 5. 特例-1 6.将指定的位置置1 7.将指定位置置1 8.a与a 9.||与&& 10.逗号表达式 11.srand与rand 12.sizeof 13.结构体初始…

操作系统 选择题 期末试题 考研真题 + 参考答案

1.&#xff08;考研真题&#xff0c;单项选择题&#xff09;单道批处理系统的主要缺点是&#xff08; &#xff09;。 A. CPU利用率不高 B.失去了交互性 C.不具备并行性 D.以上都不是 【参考答案】A 【解析】单道批处理系统的内存中只有一道程序&#xff0c;当该程序…

JVM字节码- long/double类型的比较

在 Java 虚拟机&#xff08;JVM&#xff09;字节码中&#xff0c;对于 double 和 long 类型的比较&#xff0c;没有直接等价于 iflt&#xff08;用于整型比较&#xff09;这样的指令。相反&#xff0c;比较 double 和 long 类型的值涉及到一些不同的步骤和指令。下面是如何在 J…

Node——Node.js基础

对Node.js中的基础知识进行讲解&#xff0c;包括全局变量、全局对象、全局函数以及用于实现模块化编程的exports和module对象等内容&#xff0c;这些知识是学习Node.js应用开发的基础。 1、Node.js全局对象 全局&#xff0c;即程序中任何地方都可以使用&#xff0c;Node.js内…

华为OD机试 - 分月饼(Java JS Python C)

题目描述 中秋节,公司分月饼,m 个员工,买了 n 个月饼,m ≤ n,每个员工至少分 1 个月饼,但可以分多个, 单人分到最多月饼的个数是 Max1 ,单人分到第二多月饼个数是 Max2 ,Max1 - Max2 ≤ 3 ,单人分到第 n - 1 多月饼个数是 Max(n-1),单人分到第n多月饼个数是 Max(n)…

【libGDX】加载G3DJ模型

1 前言 libGDX 提供了自己的 3D 格式模型文件&#xff0c;称为 G3D&#xff0c;包含 g3dj&#xff08;Json 格式&#xff09;和 g3db&#xff08;Binary 格式&#xff09;文件&#xff0c;官方介绍见 → importing-blender-models-in-libgdx。 对于 fbx 文件&#xff0c;libGDX…

python中的简单线性拟合

简单线性回归可以拟合线性关系的数据&#xff0c;一般使用一次函数或二次函数即可。 import numpy as np import matplotlib.pyplot as pltxnp.array([1,2,3,4,5,6,7,8,9,10]) ynp.array([2.5,4.5,4.8,5.5,6.0,7.0,7.8,8.0,9.0,10.0])#一次拟合函数 slope,interceptnp.polyfit…

大语言模型的好坏是由您提示水平高底决定的

大语言模型是有"嫌贫爱富“特点的&#xff0c;当你的水平高于大语言模型时它常常可以帮你&#xff0c;当你的水平低于大语言模型时它往往会骗你。 这主要是因为大语言模型在处理文本时具有较强的生成能力&#xff0c;可以根据已有的语境生成合乎逻辑的文本。当你的水平高于…

手机充电 显示连接耳机 (充电没外放声音) 并且充电速度很慢

现象 手机插入充电线充电 外放消失 按音量调节键 显示正在调节耳机音量 手机充电快充标识丢失 显示现在不是快充 充电速度很慢,边玩边用半小时不到2% 经测试:快充正常应该是20w,现在只有3w. 结论 排查后发现是数据线坏了,扔掉后随便换了根c2c的雷电线发现充电速度正常,不…

不受平台限制,Sketch 网页版震撼登场

Sketch 是一种基于 Mac 的矢量图形编辑器&#xff0c;可用于数字设计。其主要功能包括无损矢量编辑、完美像素精度和数百个插件同步功能&#xff0c;可导出预设和代码。它是目前流行的页面交互协作设计工具。但是 Sketch 最大的缺点是对 Windows/PC 用户不友好。严格来说&#…