首先介绍循环引用的问题:
当一个模块需要引用另一个模块的类,而另一个模块又需要引用这个模块的类时,就出现了循环引用,而没法导入类,这时候可以切断其中一条引用路径,增加一个模块
项目结构:
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()
```