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等方法,可見該標籤下其他文章
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章