了解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)