Flask遷移數(shù)據(jù)庫(kù),更新數(shù)據(jù)庫(kù)字段

1. 背景說(shuō)明:

通過(guò)SQLAlchemy來(lái)創(chuàng)建表的時(shí)候,采用的是db.create_all()方法(該方法只能使用一次),這種方法有一個(gè)非常嚴(yán)重的問(wèn)題,就是當(dāng)我們需要添加或者刪除數(shù)據(jù)庫(kù)表中的字段的時(shí)候,直接修改Models里面的類(lèi)是沒(méi)有用的,必須要把數(shù)據(jù)庫(kù)刪除了,然后重新執(zhí)行db.create_all()方法,才會(huì)把我們修改的內(nèi)容映射到數(shù)據(jù)庫(kù)中,這在項(xiàng)目上線之后,數(shù)據(jù)庫(kù)中已經(jīng)存在數(shù)據(jù)了,如果要更新數(shù)據(jù)庫(kù)了,這種方法是萬(wàn)萬(wàn)不可采用的,不可能把數(shù)據(jù)庫(kù)刪了,在重新新建,這時(shí)候就需要對(duì)數(shù)據(jù)庫(kù)進(jìn)行遷移,該遷移類(lèi)似于Django框架中的遷移。flask_migrate可以通過(guò)命令把修改后的模型直接映射到數(shù)據(jù)庫(kù)中而不用刪除數(shù)據(jù)庫(kù)。

2. 安裝包 flask-migrate

pip install flask-migrate

3. 記錄下代碼

3.1 新建config.py文件,該文件用來(lái)寫(xiě)入相關(guān)配置,下面我們配置數(shù)據(jù)庫(kù)相關(guān)

DIALECT = 'mysql'  # 要用的什么數(shù)據(jù)庫(kù)
DRIVER = 'pymysql'  # 連接數(shù)據(jù)庫(kù)驅(qū)動(dòng)
USERNAME = 'root'  # 用戶(hù)名
PASSWORD = '123456'  # 密碼
HOST = 'localhost'  # 服務(wù)器
PORT = '3307'  # 端口
DATABASE = 'migrate_test'  # 數(shù)據(jù)庫(kù)名

SQLALCHEMY_DATABASE_URI = "{}+{}://{}:{}@{}:{}/{}?charset=utf8".format(DIALECT, DRIVER, USERNAME, PASSWORD, HOST, PORT,
                                                                       DATABASE)
SQLALCHEMY_TRACK_MODIFICATIONS = False

3.2 在models中新建模型Article

先將SQLAlchemy實(shí)例化對(duì)象,此處為了不出現(xiàn)導(dǎo)包循環(huán),我們單獨(dú)將對(duì)象實(shí)例化寫(xiě)道exts.py中,如下:

from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()

獲得db實(shí)例化對(duì)象,開(kāi)始進(jìn)行模型創(chuàng)建

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)
    tags = db.Column(db.String(100), nullable=False)
    category = db.Column(db.String(10))
    img = db.Column(db.String(200))

3.3 為了清楚的表示MVC模式,MTV模式,此處我們將路由部分放在了views.py中

代碼如下:

from flask import Blueprint

blue = Blueprint('test', __name__)


@blue.route('/')
def hello():
    return 'hello flask'

3.4 重點(diǎn):manage.py文件

代碼如下:

from flask import Flask
from flask_script import Manager
from flask_migrate import Migrate, MigrateCommand
from config import SQLALCHEMY_DATABASE_URI, SQLALCHEMY_TRACK_MODIFICATIONS
from exts import db
from views import blue
# 在進(jìn)行遷移時(shí),必須導(dǎo)入模型,不然數(shù)據(jù)庫(kù)不會(huì)改變
from models import Article

app = Flask(__name__)

app.register_blueprint(blueprint=blue, url_prefix='/app')
app.config['SQLALCHEMY_DATABASE_URI'] = SQLALCHEMY_DATABASE_URI
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = SQLALCHEMY_TRACK_MODIFICATIONS
db.init_app(app)

manager = Manager(app)
# init  migrate upgrade
# 模型 -> 遷移文件 -> 表
# 1.要使用flask_migrate,必須綁定app和DB
migrate = Migrate(app, db)

# 2.把migrateCommand命令添加到manager中。
manager.add_command('db', MigrateCommand)
if __name__ == '__main__':
    manager.run()

第一次進(jìn)行遷移時(shí):

python manage.py db init  # 初始化遷移文件,系統(tǒng)默認(rèn)生成migrate文件夾
python manage.py db migrate # 檢查模型字段是否修改,如果改變,就產(chǎn)生新的遷移文件.
python manage.py db upgrade # 對(duì)遷移文件進(jìn)行遷移

后面遷移:(只需要進(jìn)行如下兩步驟):

python manage.py db migrate # 檢查模型字段是否修改,如果改變,就產(chǎn)生新的遷移文件.
python manage.py db upgrade # 對(duì)遷移文件進(jìn)行遷移

注意事項(xiàng):必須將模型在此處導(dǎo)入,才會(huì)在遷移中生效

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • flask基本講解 ''' ''' debug模式 在app.run()中傳入一個(gè)關(guān)鍵字參數(shù)debug,app.r...
    簡(jiǎn)單的小學(xué)生閱讀 888評(píng)論 0 8
  • Flask-SQLAlchemy的使用: ORM的好處:可以讓我們操作數(shù)據(jù)庫(kù)跟操作對(duì)象是一樣的,非常方便,因?yàn)橐粋€(gè)...
    Dozing閱讀 23,489評(píng)論 3 22
  • 感恩,當(dāng)前感恩這個(gè)詞經(jīng)常見(jiàn)諸于網(wǎng)絡(luò)廣播電視報(bào)紙等新聞媒體,大意是說(shuō)當(dāng)前國(guó)人心性冷漠,心中只有自我。對(duì)他人對(duì)...
    冷熱自知123閱讀 375評(píng)論 0 1
  • 周日早上8點(diǎn)我和娃兒們才起床,睡個(gè)懶覺(jué)的感覺(jué)真好!感賞公婆起床較早,我和娃們能吃到公婆做的早餐。 ...
    康明磊閱讀 415評(píng)論 0 5
  • z-index 當(dāng)元素開(kāi)啟定位之后就可以設(shè)置z-index這個(gè)屬性。 這個(gè)屬性可以提升定位元素所在的層級(jí)。 z-i...
    dream_seeker閱讀 224評(píng)論 0 0

友情鏈接更多精彩內(nèi)容