Flask 第三方組件之 Migrate

flask-migrate是flask的一個擴展模塊,主要是擴展數據庫表結構的.類似于Django的python manage.py migrate

官方文檔:?http://flask-migrate.readthedocs.io/en/latest/

安裝

pip install flask-migrate

使用舉例

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_script import Manager
from flask_migrate import Migrate, MigrateCommandapp = Flask(__name__)         # 實例化app
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///app.db'db = SQLAlchemy(app)          # 實例化db
migrate = Migrate(app, db)    # 實例化migrate,在db對象創建后調用manager = Manager(app)        # 實例化manager
manager.add_command('db', MigrateCommand)class User(db.Model):id = db.Column(db.Integer, primary_key=True)name = db.Column(db.String(128))if __name__ == '__main__':manager.run()

?執行命令

1、初始化數據庫,會創建一個migations文件夾,并且會在數據庫中生成一個alembic_version表

python manage.py db init

2、創建遷移歷史,在migrations下生成一個version文件夾,下面包含了對應版本的數據庫操作py腳本。由于migrate并不一定全部發現你對model的所有改動,因此生成的py腳本需要review, 有錯的話則需要edit。例如目前知道的,表名稱表更,列名稱變更,或給constraints命名等,migreate都不能發現的。更多限制細節見此:Alembic autogenerate documentation

python manage.py db migrate?

這條命令可以簡單理解為在flask里對數據庫(db)進行遷移(migrate)。-m選項用來添加遷移備注信息。從上面的輸出信息我們可以看到,Alembic檢測出了模型變化:添加了一個新表,刪除了一個舊表,并且相應生成了一個遷移腳本。腳本詳細信息如下:

"""empty messageRevision ID: d72a7bc93d93
Revises: 7616d2060203
Create Date: 2020-06-30 11:58:46.859000"""# revision identifiers, used by Alembic.
revision = 'd72a7bc93d93'
down_revision = '7616d2060203'from alembic import op
import sqlalchemy as sa
from sqlalchemy.dialects import mysqldef upgrade():# ### commands auto generated by Alembic - please adjust! ###op.create_table('MegviiAssset',sa.Column('id', sa.INTEGER(), nullable=False),sa.Column('uuid', sa.String(length=50), nullable=True),)op.drop_table('megviiassset')# ### end Alembic commands ###def downgrade():# ### commands auto generated by Alembic - please adjust! ###op.create_table('megviiassset',sa.Column('id', mysql.INTEGER(display_width=11), autoincrement=True, nullable=False),sa.Column('uuid', mysql.VARCHAR(length=50), nullable=True),sa.PrimaryKeyConstraint('id'),mysql_default_charset=u'utf8',mysql_engine=u'InnoDB')op.drop_table('MegviiAssset')# ### end Alembic commands ###

從上面的代碼可以看出,遷移腳本主要包含了兩個函數:upgrate()函數用來將改動應用到數據庫,而downgrade()函數用來撤消改動

就像這兩個函數中的注釋所說的,遷移命令是有Alembic自動生成的,其中可能包含錯誤,所以有必要在生成后檢查一下。因為每一次遷移都會生成新的遷移腳本,而且Alemic為每一次遷移都生成了修訂版本(revision)ID,所以數據庫可以恢復到修改歷史中的任一點。正因如此,遷移環境中的文件也要納入版本控制。

有些復雜的錯誤無法實現自動遷移,這時可以使用revision命令手動創建遷移腳本。這同樣會生成一個遷移腳本,不過腳本中的upgrade()和downgrade()函數都是空的。你需要使用Alembic提供的Operations對象指令在這兩個函數中實現具體操作,具體可以訪問Alembic官方文檔查看。

3、最后一步。此命令相當于執行了version文件夾下的相應py版本,對數據庫進行變更操作。此后,對model有變更,只要重復migrate和upgrade操作即可。

python manage.py db upgrade # 更新數據庫

如果你想回滾遷移,那么可以使用downgrade命令(降級),它會撤銷最后一次遷移在數據庫中的改動,這在開發時非常有用。比如,當執行upgrade命令后發現某些地方出錯了,這時就可以執行 python manage.py db downgrade 命令進行回滾,刪除對應的遷移腳本,重新生成遷移腳本后再進行更新(upgrade)。

1.設計表時字段的默認值,這里用參數server_default,而不是default

operator = db.Column(db.String(40), nullable=True, server_default="init_data")

2.如果報這個錯誤,將alembic_version表中的數據刪掉即可

Heroku Postgres, db migrate fail: alembic.util.exc.CommandError: Can't locate revision identified by

沒有migrations文件夾時

  1. 將 alembic_version 表刪除
  2. 重新初始化 python manage.py db init
  3. 創建遷移歷史并核對相應py文件 python manage.py db migrate
  4. 更新數據庫 python manage.py db upgrade? 如果還沒有創建數據庫和表,這個命令會自動創建,如果已經創建,則會在不損壞數據的前提下執行更新。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/454485.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/454485.shtml
英文地址,請注明出處:http://en.pswp.cn/news/454485.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

html section 布局,section標簽的用法

標簽的用法由于昨晚發了一篇文章http://www.zcool.com.cn/article/ZMzA3MzI.html,有一個網友評論問 的用法。所以現在舉例來說明一下:html5引入了標簽,用于描述文檔的結構,它同標簽的意思一樣。但是在特定環境中,兩者又…

清北學堂Day4

(1)第一題 財富(treasure) Time Limit:1000ms Memory Limit:128MB 題目描述 LYK有n個小伙伴。每個小伙伴有一個身高hi。 這個游戲是這樣的,LYK生活的環境是以身高為美的環境,因此在這里的每個人都羨慕比自己身高高的人&#xff…

Falsk session 源碼解析

Falsk框架session請求流程 from flask import Flask # 1. 實例化Flask對象 app Flask(__name__) # 2. 設置路由 app.route(/index) def index(): return "index" if __name__ __main__: # 3. 啟動socket服務端 app.run() # 4. 用戶請求到來 ap…

vlc內部運行機制以及架構分析

VLC架構剖析1. VideoLan簡介1.1 videolan組成Videolan有以下兩部分組成:VLC:一個最主要的部分,它可以播放各種類型的媒體文件和流vlc架構剖析 1. VideoLan簡介 1.1 videolan組成 Videolan有以下兩部分組成: VLC:一個最主要的部分,它可以播放各種類型的媒…

visio中公式太小_visio繪圖中的數據計算

在繪流程圖時,我們有時候會想直接在流程圖上做計算,比如化工設計時精餾塔計算理論塔板數。在VISIO中,實現這個功能還是比較容易,舉一個最簡單的例子。如下圖所示,等號后面的數字可以根據前面的數字變化。實現過程如下&…

Django syncdb mysql error on localhost - (1045, Access denied for user 'ODBC'@'

環境:WINDOWS系統 將數據庫配置 DATABASES { default: { ENGINE: django.db.backends.mysql, HOST: localhost, PORT: 3306, NAME: yunwei, USERNAME: root, PASSWORD: mysql, } } 改為 DATABASES { default: { ENGINE: django.db.backends.mysql, HOST: localhos…

銀行招計算機專業算什么崗,銀行計算機專業崗位全方位分析

黑龍江銀行招聘信息陸續發布,中公教育專家為各位考生提供:銀行計算機專業崗位全方位分析!供大家參考,預祝大家取得好成績,更多黑龍江人民銀行招聘相關資料請關注黑龍江銀行招聘網。金融銀行部門一直是一個朝陽產業&…

【47.92%】【hdu 5763】Another Meaning

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 1440 Accepted Submission(s): 690 Problem DescriptionAs is known to all, in many cases, a word has two meanings. Such as “hehe”, which not only mea…

root用戶登錄mysql后新建用戶提示1045錯誤

執行以下命令查看root權限 show grants for rootlocalhost; 如果沒有顯示with grant option,說明是root沒有擁有新建授權用戶的權限(為什么會這樣呢,因為我把userroot and hostlocalhost給刪掉了,然后重新授權all privileges給新建root用戶&a…

Flask werkzeug 源碼解析

Flask werkzeug流程大概:執行run_simple ,實際執行為先用make_server 創建一個 BaseServer 實例,然后執行 實例的serve_forever 方法, serve_forever 調用 run_simple 傳入的第三個參數,執行(self, environ, start_response) &am…

AVS 幀內預測模式的匯編優化

王瑞*基金項目:本課題得到國家自然科學基金資助項目基金(項目編號:60772101)的資助。作者簡介:王瑞(1986—), 男, 山東萊蕪人, 碩士, 主要從事視頻壓縮方面的研究. E-mai…

ltsc系統激活_WIN10_X64企業版LTSC 電腦公司裝機版 202008

文件: WIN10_X64_LTSC_ZJ202008.esd大小: 7431429353 字節(6.92G)MD5: A3A3B15ED47216E177C924D2E07E0799SHA1: 3A647265E0C8234225C633407093BAA07253FB34CRC32: 32E791E9(注意,下載文件有一定幾率損壞,如文件值不對請重新下載!)360安全云盤…

大學計算機應用基礎考試題庫,大學計算機應用基礎考試題庫

綜合模擬(四)一、選擇題。1、完整的計算機硬件系統一般包括外部設備和 C 。A、運算器的控制器 B、存儲器 C、主機 D、中央處理器2、計算機能夠自動工作,主要是因為采用了 D 。A、二進制數制 B、高速電子元件 C、存儲程序控制 D、程序設計語言3、下面哪能一組是系統軟…

Lombok 使用小結

Lombok 使用小結 Lombok 簡介Lombok 安裝Lombok 使用 API示例示例源碼引用和引申Lombok 簡介 Lombok 是一種 Java 實用工具,可用來幫助開發人員消除 Java 的冗長,尤其是對于簡單的 Java 對象(POJO)。它通過注釋實現這一目的。通過…

html表單input file,input標簽type=file的文件上傳

一,通過表單提交的方式該提交方式只是提交普通表單;對于file組所選中的文件內容是不上傳的,因此需要設置:enctype屬性enctype"multipart/form-data"如果想上傳多文件,可添加multiple二,通過Ajax異…

AVS游程解碼、反掃描、反量化和反變換優化設計

中圖分類號:TN919.81   文獻標識碼:A   文章編號:1009-2552 (2007) 02-0054-04AVS游程解碼、反掃描、反量化和反變換優化設計趙 策, 劉佩林(上海交通大學電子工程系, 上海200240)摘 要: 提出了一種適用于AVS的游程解碼、反掃描、反量化和反變換硬件結構優化設計方案。根據…

Django REST framework介紹

現在前后端分離的架構設計越來越流行,業界甚至出現了API優先的趨勢。 顯然API開發已經成為后端程序員的必備技能了,那作為Python程序員特別是把Django作為自己主要的開發框架的程序員,Django REST framework(DRF)這個…

zabbix 安裝_安裝zabbix

準備一個純凈環境10.0.0.99首先修改yum源,修改為zabbix清華源,清華源玉zabbix官方源都是同步的,下載速度更快!zabbix官方Download Zabbix?www.zabbix.com點擊下載,下面有zabbix的歷史版本以及官方安裝文檔可以查看到不…

拓展歐幾里得 [Noi2002]Savage

對于一個野人,他(她?)所在的位置,(C[i]x*p[i])%ans,是的,暴力枚舉每一個ans,用拓展歐幾里得求出每兩個wildpeople(wildrage?)相遇的年份,如果小于最小的壽限…

CCNP-19 IS-IS試驗2(BSCI)

CCNP-19 IS-IS試驗2 實驗拓撲:試驗要求:R1 R2 R3全部采用集成的ISIS路由協議,R1 R2在區域49.0001內,R3在區域49.0002內,R1與R2之間的鏈路類型為L1,R2與R3之間的鏈路類型為L2。 試驗目的:掌握基…