一.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()