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開發之路九