因为采用
db.create_all
在后期修改字段的时候,不会自动更改到数据库中,必须删除表,然后重新运行db.create_all
才会重新映射,这样是不符合实际情况的。因此flask-migrate就解决了这个问题,可以直接将修改的东西映射到数据库中。
1.使用flask-migrate
必须借助flask-scripts
,这个包MigrateCommand
中包含了所有和数据库相关的命令。
2.flask-migrate`相关命令:
python manage.py db init
:初始化一个迁移脚本的环境,只需要执行一次。python manage.py db migrate
:将模型生成迁移文件,只要模型更改了,就需要执行一次这个命令。- python manage.py db upgrade`:将迁移文件真正的映射到数据库中。每次也需要执行一次这个命令。
3.注意点:
需要将你想要映射到数据库中的模型,都要导入到manage.py
文件中,如果没有导入进去,就不会映射到数据库中。
代码:
db_demo3:
from flask import Flask
from exts import db
import config
import pymysql
pymysql.install_as_MySQLdb()
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)
manage.py:
from flask_script import Manager
from db_demo3 import app
from flask_migrate import Migrate,MigrateCommand
from exts import db
from models import Article
manager = Manager(app)
migrate = Migrate(app,db)
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)
config.py
DIALECT = 'mysql'
DRIVER = 'mysqldb'
USERNAME = 'root'
PASSWORD = '123456'
HOST = '127.0.0.1'
PORT = '3306'
DATABASE = 'db_demo3'
SQLALCHEMY_DATABASE_URI = "{}+{}://{}:{}@{}:{}/{}?charset=utf8".format(DIALECT,DRIVER,USERNAME,PASSWORD
,HOST,PORT,DATABASE)
SQLALCHEMY_TRACK_MODIFICATIONS = False