了解flask_migrate需要先了解flask-script,那么flask-script的作用是什么呢?flask-script的作用是可以通過命令行的形式來操作Flask。例如通過命令跑一個開發版本的服務器、設置數據庫,定時任務等。
2.執行pip install flask-script
來進行安裝。
- 如果直接在主
manage.py
中寫命令,那么在終端就只需要python manage.py command_name
就可以了。 - 如果把一些命令集中在一個文件中,那么在終端就需要輸入一個父命令,比如
python manage.py db init
。
app.py文件
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello World!'
if __name__ == '__main__':
app.run()
manager.py文件
# encoding: utf-8
from flask_script import Manager
from app import app
manager = Manager(app)
@manager.command
def run():
print("服務器跑起來了")
if __name__ == '__main__':
manager.run()
在終端運行,run代表的是manager.py中的方法
python manage.py run
服務器跑起來了
flask-script我們一般和數據庫在一起使用
app.py文件
#encoding: utf-8
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello World!'
if __name__ == '__main__':
app.run(debug=True)
manage.py文件
#encoding: utf-8
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello World!'
if __name__ == '__main__':
app.run(debug=True)
db_scripts.py文件
# encoding: utf-8
from flask_script import Manager
DBManager = Manager()
@DBManager.command
def init():
print('數據庫初始化完成')
@DBManager.command
def migrate():
print('數據表遷移成功')
首先執行如下命令:
python manage.py db init
數據庫初始化完成
再執行命令
python manage.py db migrate
數據表遷移成功
上面使用flask-script的使用以及對數據庫的演示,實際開發中我們使用flask-migrate來動態的遷移數據庫,使用flask-migrate必須借助flask-script。
Flask-Migrate的介紹與安裝:
pip install flask-migrate
搞起!!!
migrate_demo.py文件
from flask import Flask
import config
from exts import db
app = Flask(__name__)
app.config.from_object(config)
db.init_app(app)
@app.route('/')
def hello_world():
return 'Hello World!'
if __name__ == '__main__':
app.run(debug=True)
exts.py文件
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
config.py文件
DIALECT = 'mysql'
DRIVER = 'pymysql'
USERNAME = 'root'
PASSWORD = '123456'
HOST = '127.0.0.1'
PORT = '3306'
DATABASE = 'pythonflask'
SQLALCHEMY_DATABASE_URI = "{}+{}://{}:{}@{}:{}/{}?charset=utf8".format(DIALECT, DRIVER, USERNAME, PASSWORD, HOST, PORT,
DATABASE)
SQLALCHEMY_TRACK_MODIFICATIONS = False
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)
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
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()
我們使用的是pythonflask這個數據庫,里面沒有任何的表和數據。
- 終端執行命令第一個命令:
python manage.py db init
上面的命令執行后,在我們的項目中會生成一個migrations文件夾,如下所示,versions中沒有任何內容:
上面的命令執行完后,來看看數據庫發生變化沒有:
可以看出,此時數據庫沒有發生任何變化。
- 上面的命令成功后,執行如下命令,將模型生成遷移文件:
python manage.py db init
如下所示,versions文件夾中生成了一個文件c6439ddd759f_.py,這個就是遷移文件。
c6439ddd759f_.py:
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = 'c6439ddd759f'
down_revision = None
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
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.PrimaryKeyConstraint('id')
)
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.drop_table('article')
# ### end Alembic commands ###
再來看看數據庫發生了什么變化:
這時多了一個alembic_version文件,這個文件是遷移文件的版本號。
- 接下來執行最后一個命令,將遷移文件真正的映射到數據庫中:
python manage.py db upgrade
查看數據庫的變化:
可以看出,這個命令執行完后,數據才真正的遷移到數據庫了。
現在article中我們可以看到只有如下字段:
那這時候如果我想再插入一個字段,該如何操作呢?只需要把上面的命令執行一遍就可以,但不是每個命令都執行的。
python manage.py db init
:這個命令不需要執行,因為已經初始化了遷移腳本的環境,這個命令只執行一次。
python manage.py db migrate
:這個命令需要執行,因為模型改變了。
python manage.py db upgrade
這個命令也需要執行,每次運行了migrate
命令后,就記得要運行這個命令。
增加的這個字段為“name”:
class Article(db.Model):
__tablename__ = 'article'
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
title = db.Column(db.String(100), nullable=False)
name = db.Column(db.String(100), nullable=False)
content = db.Column(db.Text, nullable=False)
命令執行完后,查看數據庫:
更新成功了!!!!!!!
總結如下:
- 介紹:因為采用
db.create_all
在后期修改字段的時候,不會自動的映射到數據庫中,必須刪除表,然后重新運行db.craete_all
才會重新映射,這樣不符合我們的需求。因此flask-migrate就是為了解決這個問題,它可以在每次修改模型后,可以將修改的東西映射到數據庫中。 - 使用
flask_migrate
必須借助flask_scripts
,這個包的MigrateCommand
中包含了所有和數據庫相關的命令。 -
flask_migrate
相關的命令:-
python manage.py db init
:初始化一個遷移腳本的環境,只需要執行一次。 -
python manage.py db migrate
:將模型生成遷移文件,只要模型更改了,就需要執行一遍這個命令。 -
python manage.py db upgrade
:將遷移文件真正的映射到數據庫中。每次運行了migrate
命令后,就記得要運行這個命令。
-
- 注意點:需要將你想要映射到數據庫中的模型,都要導入到
manage.py
文件中,如果沒有導入進去,就不會映射到數據庫中。
最后我們可以隨心所欲的來對數據庫進行增刪改查了,簡單的在article中插入一條數據,修改migrate_demo.py文件:
from flask import Flask
import config
from exts import db
from models import Article
app = Flask(__name__)
app.config.from_object(config)
db.init_app(app)
# 新增數據
@app.route('/addData')
def addData():
article = Article(title='aaaa', content='dsfsdf')
db.session.add(article)
db.session.commit()
return 'Hello World!'
@app.route('/')
def hello_world():
return 'Hello World!'
if __name__ == '__main__':
app.run(debug=True)