一.flask 分开models 和解除循环引用
1.数据库存在的问题,models需要引用app中的app模型,而主app文件(这里为flask_migrate_demo)需要引用 models中的db;
2.解决办法:将db放在一个单独引用中,切断循环引用的线条(这里定义为exts.py文件)
新建exts(extension)文件第三方的引用
二.数据库的迁移更新
如果后期需要给Aritcle新建一个字段,方便的将该字段更新到数据库中,比如需要增加一个content字段,没有migrate时,做法是需要将表删除,然后再重新建立,这里导入migrate之后,只需要执行下面的命令即可。
init migrate upgrade
模型 --> 迁移文件 --> 表
- python manage.py db init 初始化迁移环境 生成 migrations文件夹 (首次执行会生成migrations文件夹)
- python manage.py db migrate 生成 versions 下的迁移文件
- python manage.py db update 将表映射到数据库中去
- 如果改变了模型,比如给模型Article新增加了一个字段,只需要执行命令 2 和 3 即可。
首次执行之后数据库中会出现alembic_version的一个数据,该数据库会管理模型中目标数据库(这里为article_migrate)的更新。
[注]:需要将数据库想要映射到数据库中的模型,都要导入到manage.py文件中,否则不会被映射到数据库中
关于manage,可见链接
三.代码部分
1. config.py
DIALECT = 'mysql'
DRIVER = 'mysqldb'
USERNAME = '自己数据库的用户名'
PASSWORD = '数据的密码'
HOST = '127.0.0.1'
PORT = '3306'
DATABSE = '数据库名称'
SQLALCHEMY_DATABASE_URI = "{}+{}://{}:{}@{}:{}/{}?charset=utf8".format(DIALECT,DRIVER,USERNAME,PASSWORD,HOST,PORT,DATABSE)
SQLALCHEMY_TRACK_MODIFICATIONS = False
2. exts.py
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
3.
from flask import Flask
from exts import db
from models import Article
import config
app = Flask(__name__)
app.config.from_object(config)
db.init_app(app)
# 没有manage之前,需要手动将当前app推到服务器栈顶 需要将手动导入删除
"""
1. 因为采用db.create_all()后期修改字段之后,不会自动映射到数据库中,必须删除重新建立
flask-migrate解决该问题
"""
# with app.app_context():
# db.create_all()
@app.route('/')
def hello_world():
return 'Hello World!'
if __name__ == '__main__':
app.run()
4.
from flask_script import Manager
from Flask_migrate_demo import app
from flask_migrate import Migrate,MigrateCommand
from exts import db
from models import Article
# 上面一个 Article为导入的模型,为方便数据库映射,代码就会知道需要将Article导入
manager = Manager(app)
# 1. 要使用flask_migrate 必须绑定app 和 db
migrate = Migrate(app,db)
# 2. 把migrateCommand命令添加到manager中
manager.add_command('db',MigrateCommand)
migrate =Migrate(app,db)
if __name__ == '__main__':
manager.run()
5.models.py
from flask_script import Manager
from Flask_migrate_demo import app
from flask_migrate import Migrate,MigrateCommand
from exts import db
from models import Article
# 上面一个 Article为导入的模型,为方便数据库映射,代码就会知道需要将Article导入
manager = Manager(app)
# 1. 要使用flask_migrate 必须绑定app 和 db
migrate = Migrate(app,db)
# 2. 把migrateCommand命令添加到manager中
manager.add_command('db',MigrateCommand)
migrate =Migrate(app,db)
if __name__ == '__main__':
manager.run()