1. 程式人生 > >Flask web開發之路九

Flask web開發之路九

world art 更改 vertical all alc 綁定 integer scripts

首先介紹循環引用的問題:

當一個模塊需要引用另一個模塊的類,而另一個模塊又需要引用這個模塊的類時,就出現了循環引用,而沒法導入類,這時候可以切斷其中一條引用路徑,增加一個模塊

項目結構:

技術分享圖片

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