flask 分开models, 解除循环引用以及 flask migrate

一.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
模型 --> 迁移文件 --> 表

  1. python manage.py db init 初始化迁移环境 生成 migrations文件夹 (首次执行会生成migrations文件夹)
  2. python manage.py db migrate 生成 versions 下的迁移文件
  3. python manage.py db update 将表映射到数据库中去
  4. 如果改变了模型,比如给模型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()
关于本blog 中出现的manage等方法,可见该标签下其他文章
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章