flask数据库迁移理解及命令
前言:
- 使用數(shù)據(jù)庫遷移,可以直接建表,而不用我們自己寫sql語句用來建表。就是將關(guān)系型數(shù)據(jù)庫的一張張表轉(zhuǎn)化成了Python的一個(gè)個(gè)類。
- 在開發(fā)中經(jīng)常會(huì)遇到需要修改原來的數(shù)據(jù)庫模型,修改之后更新數(shù)據(jù)庫,最簡單粗暴的方式就是刪除舊表,然后在增加新表,這樣做的缺點(diǎn)是會(huì)造成數(shù)據(jù)丟失。
- 使用數(shù)據(jù)庫遷移,可以追蹤數(shù)據(jù)庫模式的變化,然后把變動(dòng)應(yīng)用到數(shù)據(jù)庫中。
- 在flask中使用Flask-Migrate來實(shí)現(xiàn)數(shù)據(jù)庫遷移,并且集成到Flask-Script中,所有的操作通過命令來完成。
- 為了導(dǎo)出數(shù)據(jù)庫遷移命令,Flask-Migrate使用了一個(gè)MigrateCommand類,可以附加到Flask-Script的manager對象上。
安裝Flask-Migrate
pip install flask-migratePython代碼,用戶類和角色類。
#!/usr/bin/python #coding:utf-8from flask import Flask from flask_sqlalchemy import SQLAlchemy from flask_script import Manager from flask_migrate import Migrate,MigrateCommand""" flask_migrate作用: 1、通過命令的方式創(chuàng)建表 2、修改表的結(jié)構(gòu) """ class Config(object):SQLALCHEMY_DATABASE_URI = "mysql://root:@127.0.0.1:3306/book"# 這個(gè)值可以設(shè)置,也可以不設(shè)置,如果不設(shè)置,那么會(huì)一直報(bào)警告SQLALCHEMY_TRACK_MODIFICATIONS = False# 這里有個(gè)坑,下次再講。在lask-sqlalchemy 2.0之后就不在需要設(shè)置這一項(xiàng)了。SQLALCHEMY_COMMIT_ON_TEARDOWN = Trueapp = Flask(__name__) app.config.from_object(Config)db = SQLAlchemy(app) manager = Manager(app)# 第一個(gè)參數(shù)是flask實(shí)例,第二個(gè)參數(shù)SQLAlchemy實(shí)例 Migrate(app, db)#manager是Flask-Script的實(shí)例,這條語句在flask-Script中添加一個(gè)db命令 manager.add_command("db", MigrateCommand)class Role(db.Model):__tablename__ = "roles"id = db.Column(db.Integer, primary_key=True)name = db.Column(db.String(128))title = db.Column(db.String(128))us = db.relationship("User",backref="role")class User(db.Model):__tablename__="users"id = db.Column(db.Integer,primary_key=True)name = db.Column(db.String(128))email = db.Column(db.String(128))password = db.Column(db.String(128))role_id = db.Column(db.Integer,db.ForeignKey("roles.id"))@app.route("/") def index():return "index"if __name__ == '__main__':manager.run()關(guān)于config的配置,可以參考flask-Script中文文檔
?
?
遷移數(shù)據(jù)庫三步走:
第一步:創(chuàng)建遷移倉庫
python database.py db init這里的db是遷移命令的對象,名字可以隨便取,但是需要保持一致。
這個(gè)命令會(huì)創(chuàng)建migrations文件夾,所有遷移文件都放在里面。
這里只是創(chuàng)建了遷移倉庫,表還沒創(chuàng)建。
?可以看到表還沒有創(chuàng)建。
?
?第二步:創(chuàng)建遷移腳本
- 自動(dòng)創(chuàng)建遷移腳本有兩個(gè)函數(shù)
- upgrade():函數(shù)把遷移中的改動(dòng)應(yīng)用到數(shù)據(jù)庫中。
- downgrade():函數(shù)則將改動(dòng)刪除。
- 自動(dòng)創(chuàng)建的遷移腳本會(huì)根據(jù)模型定義和數(shù)據(jù)庫當(dāng)前狀態(tài)的差異,生成upgrade()和downgrade()函數(shù)的內(nèi)容。
- 對比不一定完全正確,有可能會(huì)遺漏一些細(xì)節(jié),需要進(jìn)行檢查
在windows下這里也存在一個(gè)坑。
這個(gè)坑在這里解釋下:
windows系統(tǒng)不支持cmd接收的參數(shù)中含有空格,例如我們上面'initial migration',系統(tǒng)收到的是兩個(gè)參數(shù),所以報(bào)錯(cuò)會(huì)顯示參數(shù)過多。
我的解決辦法是在兩個(gè)單詞之間加上“_”連接當(dāng)然方法很多,我這里就使用這種簡單粗暴的。
這種情況下,注釋會(huì)報(bào)錯(cuò)。
這樣則不會(huì)。
運(yùn)行命令之后,只是在migrations文件夾中新增了數(shù)據(jù)庫遷移的版本文件并沒有在數(shù)據(jù)庫也只是創(chuàng)建了版本號(hào),并沒有生成對應(yīng)的表。
第三步:更新數(shù)據(jù)庫
?更新數(shù)據(jù)庫命令:
python migrate.py db upgrade可以看到已經(jīng)創(chuàng)建表成功了。
如果我們需要講roles表中的title字段刪除,我們再看下版本文件的變化。
刪除前:
刪除后:
將代碼中的title刪除,然后再次執(zhí)行遷移腳本命令
python migrate.py db migrate -m 'del_title'這個(gè)時(shí)候數(shù)據(jù)庫中title字段還沒有被刪除
執(zhí)行更新數(shù)據(jù)庫操作:
可以看到數(shù)據(jù)庫中,數(shù)據(jù)被刪除。
python migrate.py db upgrade?
?
實(shí)際操作順序: 1.python 文件 db init 2.python 文件 db migrate -m"版本名(注釋)" 3.python 文件 db upgrade 然后觀察表結(jié)構(gòu) 4.根據(jù)需求修改模型 5.python 文件 db migrate -m"新版本名(注釋)" 6.python 文件 db upgrade 然后觀察表結(jié)構(gòu) 7.若返回版本,則利用 python 文件 db history查看版本號(hào) 8.python 文件 db downgrade(upgrade) 版本號(hào)?
?先寫這么多,發(fā)現(xiàn)寫起來,真的有很多內(nèi)容可以寫。待續(xù)。。。
轉(zhuǎn)載于:https://www.cnblogs.com/itpython/p/10440786.html
總結(jié)
以上是生活随笔為你收集整理的flask数据库迁移理解及命令的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 初学者浅谈我对领域驱动设计(DDD)的理
- 下一篇: mysql当前用户user()与curr