Flask web开发之路十
首先介绍循环引用的问题:
当一个模块需要引用另一个模块的类,而另一个模块又需要引用这个模块的类时,就出现了循环引用,而没法导入类,这时候可以切断其中一条引用路径,增加一个模块
项目结构:

models_sep.py代码:
from flask import Flask
from models import Article
from exts import db
import config app = Flask(__name__)
app.config.from_object(config)
db.init_app(app) #db.create_all() @app.route('/')
def hello_world():
return 'Hello World!' if __name__ == '__main__':
app.run(debug=True)
models.py代码:
from exts import db class Article(db.Model):
__tablename = 'article'
id = db.Column(db.Integer,primary_key=True,autoincrement=True)
title = db.Column(db.String(100),nullable=False)
exts.py代码:
from flask_sqlalchemy import SQLAlchemy db = SQLAlchemy()
### 分开`models`以及解决循环引用:
1. 分开models的目的:为了让代码更加方便的管理。
2. 如何解决循环引用:把`db`放在一个单独的文件中,切断循环引用的线条就可以了。
然后,讲一下模型初始化init,模型迁移migrate和模型upgrade
要解决的问题:假如第一次创建好数据模型后,之后要更改模型结构,增删改查等等,粗暴的方式是删掉整张表,然后再新建,但是这样非常不利于维护,因此有需要用到Flask_Migrate
项目结构:

migrate_demo.py代码:
from flask import Flask
from exts import db
import config
from models import Article app = Flask(__name__)
app.config.from_object(config)
db.init_app(app) # 新建一个article模型,采用models分开的方式
# flask-scripts @app.route('/')
def hello_world():
return 'Hello World!' if __name__ == '__main__':
app.run(debug=True)
manage.py文件代码:
from flask_script import Manager
from migrate_demo import app
from flask_migrate import Migrate,MigrateCommand
from exts import db
from models import Article # init
# migrate
# upgrade
#模型 -> 迁移文件 -> 表 manager = Manager(app) #1.要使用flask_migrate,必须要绑定app和db
migrate = Migrate(app,db) #2.把MigrateCommand命令添加到manager中
manager.add_command('db',MigrateCommand) if __name__ == '__main__':
manager.run()
exts.py文件代码;
from flask_sqlalchemy import SQLAlchemy db = SQLAlchemy()
models.py文件代码:
from exts import db class Article(db.Model):
__tablename__ = 'article'
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)
tags = db.Column(db.String(100),nullable=False)
#authors = db.Column(db.String(20),nullable=False)
在终端的项目文件路径中依次运行:
python manage.py db init
python manage.py db migrate
python manage.py db upgrade
发现在数据库中已经创建好了article表

然后在models.py文件里给数据模型新增一个数据字段authors,接着在终端里运行python manage.py db migrate和python manage.py db upgrade
可以用发现数据库表里面已经对article做了修改:

### Flask-Migrate的介绍与安装:
1. 介绍:因为采用`db.create_all`在后期修改字段的时候,不会自动的映射到数据库中,必须删除表,然后重新运行`db.craete_all`才会重新映射,这样不符合我们的需求。因此flask-migrate就是为了解决这个问题,她可以在每次修改模型后,可以将修改的东西映射到数据库中。
2. 首先进入到你的虚拟环境中,然后使用`pip install flask-migrate`进行安装就可以了。
3. 使用`flask_migrate`必须借助`flask_scripts`,这个包的`MigrateCommand`中包含了所有和数据库相关的命令。
4. `flask_migrate`相关的命令:
* `python manage.py db init`:初始化一个迁移脚本的环境,只需要执行一次。
* `python manage.py db migrate`:将模型生成迁移文件,只要模型更改了,就需要执行一遍这个命令。
* `python manage.py db upgrade`:将迁移文件真正的映射到数据库中。每次运行了`migrate`命令后,就记得要运行这个命令。
5. 注意点:需要将你想要映射到数据库中的模型,都要导入到`manage.py`文件中,如果没有导入进去,就不会映射到数据库中。
6. `manage.py`的相关代码:
```
from flask_script import Manager
from migrate_demo import app
from flask_migrate import Migrate,MigrateCommand
from exts import db
from models import Article
# init
# migrate
# upgrade
# 模型 -> 迁移文件 -> 表
manager = Manager(app)
# 1. 要使用flask_migrate,必须绑定app和db
migrate = Migrate(app,db)
# 2. 把MigrateCommand命令添加到manager中
manager.add_command('db',MigrateCommand)
if __name__ == '__main__':
manager.run()
```
Flask web开发之路十的更多相关文章
- Flask web开发之路十四
今天开始Flask的实战,创建一个项目,实现包括用户登录.注册.注销.发表博客.评论以及检索等功能 首先给出项目结构: 1.config.py文件: 存放各种配置信息 import os # dial ...
- Flask web开发之路十二
ge请求和post请求 ### get请求和post请求:1. get请求: * 使用场景:如果只对服务器获取数据,并没有对服务器产生任何影响,那么这时候使用get请求. * 传参:get请求传参是放 ...
- Flask web开发之路九
flask_scripts介绍 项目结构如下: flask_script_demo.py文件: from flask import Flask app = Flask(__name__) @app.r ...
- Flask web开发之路一
之前学过一段时间的flask,感觉还是挺好用的,自己的专利挖掘项目也想这个web框架来搭建,于是重新开始基础学习 环境:win10,python3.6,pycharm2017,虚拟环境virtuale ...
- Flask web开发之路十三
g对象 ### 保存全局变量的g属性:g:global1. g对象是专门用来保存用户的数据的.2. g对象在一次请求中的所有的代码的地方,都是可以使用的. 项目结构: g_demo.py文件代码: f ...
- Flask web开发之路十一
首先写一下cookie和session的概念,然后是Flask中session的工作机制以及操作session ### cookie: 1. `cookie`出现的原因:在网站中,http请求是无状态 ...
- Flask web开发之路八
今天写Flask_SQLAlchemy的外键及其关系 ### Flask-SQLAlchemy外键及其关系: 主app文件代码: from flask import Flask from flask_ ...
- Flask web开发之路七
今天写SQLAlchemy数据库 首先介绍ORM的概念: ORM,Object类,Relationship:关系,Mapping:映射,也就是模型关系映射 flask-sqlalchemy是一套ORM ...
- Flask web开发之路六
紧接着上篇文档,写模板继承和block,URL链接和加载静态文件 模板继承和block 项目结构 主app文件代码: from flask import Flask,render_template a ...
随机推荐
- 《A.I.爱》王力宏与人工智能谈恋爱 邀李开复来客串
2017年9月19日下午,王力宏首张数字专辑<A.I.爱>亚洲发布会在北京举行,力宏在新歌MV中化身技术男,网红机器人Sophia扮新娘!和Robo Alpha机器人天团大跳舞蹈,与超跑酷 ...
- AutoMapperExtension
using System; using System.Collections.Generic; using System.Linq; using AutoMapper; using System.Co ...
- 使用AOF持久化文件实现还原Redis数据库并得到RDB持久化文件
目录 1 编写本文的初衷 2 具体实施 2.1 Redis持久化概念简介 2.2 获取指定Redis的AOF持久化文件 2.3 把Redis的持久化AOF文件转换为RDB文件 1 编写本文的初衷 因为 ...
- MongoDB 进程控制系列一:查看当前正在执行的进程
1:查看MongoDB当前正在做哪些操作? db.currentOp() 等同于: db.$cmd.sys.inprog.findOne() 2:查看当前有多少个连接? db.serverStatus ...
- funny
var life = { "work_hard","have_fun","make_history" };
- web html 在线调试工具
html 的主要在线调试工具有以下几个: 1. plnkr.co 速度快,支持任意的外部css 和 js. 推荐. http://plnkr.co/edit/?p=preview 2. jsbin. ...
- MySQL设置全局sql日志
分别执行开启日志以及日志路径和日志文件名 SET GLOBAL general_log_file = '/var/lib/mysql/localhost.log';SET GLOBAL genera ...
- Bash 中的特殊字符大全【转】
Linux下无论如何都是要用到shell命令的,在Shell的实际使用中,有编程经验的很容易上手,但稍微有难度的是shell里面的那些个符号,各种特殊的符号在我们编写Shell脚本的时候如果能够用的好 ...
- ajax请求中的6个全局事件
//事件触发顺序ajaxStart,ajaxSend,ajaxSuccess或ajaxError,ajaxComplete,ajaxStop $(document).ajaxStart(functio ...
- 虚拟机centos 7联网设置之NAT方式
第一步在设置虚拟机的连接模式为NAT,虚拟机是VMware12的版本 第二步在PC主机上设置网络共享 第三步将虚拟机网卡开启,默认关闭状态,开启网卡 ip link set ens32 up (ens ...