日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

flask数据库迁移理解及命令

發(fā)布時(shí)間:2025/7/14 数据库 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 flask数据库迁移理解及命令 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

前言:

  • 使用數(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-migrate

Python代碼,用戶類和角色類。

#!/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)行檢查
python database.py db migrate -m 'initial migration' "initial migration"是注釋

在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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。