Python學習筆記:Flask-Migrate基於model作upgrade的基本原理

 
1)flask-migrate的官網: https://flask-migrate.readthedocs.io/en/latest/ 
2)獲取幫助,在pycharm的控制檯中輸入 flask db  --help,或者flask db migrate  --help,這樣就能夠了解各個命令的信息了
3)通常用法,
    >flask db init
    >flask db migrate
    >flask db upgrade
    後續對腳本有任何的修改,只要重複執行後兩句就能夠了。
 
4)測試1:添加一行數據,刪除email列,而後再加上
    針對下面這個表:
 
1 class User(db.Model):
2     __tablename__ = 'user'
3     id = db.Column(db.Integer,primary_key=True)
4     username = db.Column(db.String(64),index=True,unique=True)
5     email = db.Column(db.String(120),index=True,unique=True)
6     password_hash = db.Column(db.String(128))
7  
8     def __repr__(self):
9         return '<用戶名:{}>'.format(self.username)

 

 
 
    a)先經過以上3個命令建立表;
    b)而後再數據庫中插入一條數據;
    c)而後從models中把email列刪除,執行migrate ,updrade,此時發現,數據還在,只是列刪除了;
    d)而後恢復email列,執行migrate,upgrade,此時發現,數據還在,增長了一個email的空列;
    仔細觀察日誌,發現這個upgrade執行的是升級,而不是從新建立
 
INFO  [alembic.runtime.migration] Running upgrade 04a26df9c6d3 -> 04f13e3c2f7e, empty message

 

 
 
其中04a26df9c6d3_.py的內容爲:
 
 
 
 1 """empty message
 2 Revision ID: 04a26df9c6d3
 3 Revises: 4ed84444672c
 4 Create Date: 2018-08-29 07:14:44.779039
 5  """
 6 from alembic import op
 7 import sqlalchemy as sa
 8  
 9  
10 # revision identifiers, used by Alembic.
11 revision = '04a26df9c6d3'
12 down_revision = '4ed84444672c'
13 branch_labels = None
14 depends_on = None
15  
16  
17 def upgrade():
18     # ### commands auto generated by Alembic - please adjust! ###
19     op.drop_index('ix_user_email', table_name='user')
20     op.drop_column('user', 'email')
21     # ### end Alembic commands ###
22  
23  
24 def downgrade():
25     # ### commands auto generated by Alembic - please adjust! ###
26     op.add_column('user', sa.Column('email', sa.VARCHAR(length=120), autoincrement=False, nullable=True))
27     op.create_index('ix_user_email', 'user', ['email'], unique=True)
28     # ### end Alembic commands ###

 

 
 
 
04f13e3c2f7e_.py 的內容爲
 1 """empty message
 2  
 3 Revision ID: 04f13e3c2f7e
 4 Revises: 04a26df9c6d3
 5 Create Date: 2018-08-29 07:19:33.876815
 6  
 7 """
 8 from alembic import op
 9 import sqlalchemy as sa
10  
11  
12 # revision identifiers, used by Alembic.
13 revision = '04f13e3c2f7e'
14 down_revision = '04a26df9c6d3'
15 branch_labels = None
16 depends_on = None
17  
18  
19 def upgrade():
20     # ### commands auto generated by Alembic - please adjust! ###
21     op.add_column('user', sa.Column('email', sa.String(length=120), nullable=True))
22     op.create_index(op.f('ix_user_email'), 'user', ['email'], unique=True)
23     # ### end Alembic commands ###
24  
25  
26 def downgrade():
27     # ### commands auto generated by Alembic - please adjust! ###
28     op.drop_index(op.f('ix_user_email'), table_name='user')
29     op.drop_column('user', 'email')
30     # ### end Alembic commands ###

 


 
 
 
 
5)測試2:把user表刪除
    a)若是隻執行flask db upgrade,則什麼都不執行

(venv) D:\WORK\gitbase\HelloFlask>flask db upgrade
INFO [alembic.runtime.migration] Context impl PostgresqlImpl.
INFO [alembic.runtime.migration] Will assume transactional DDL.
 
 
    b)執行flask db migrate,而後再執行flask db upgrade,則能夠從新建立表
    經過migrate,程序會先比較本地的model和數據庫中實際的表,而後建立以下腳本 69f5e753ee6c_.py
 1 """empty message
 2  
 3 Revision ID: 69f5e753ee6c
 4 Revises: 04f13e3c2f7e
 5 Create Date: 2018-08-29 07:31:19.236320
 6  
 7 """
 8 from alembic import op
 9 import sqlalchemy as sa
10  
11  
12 # revision identifiers, used by Alembic.
13 revision = '69f5e753ee6c'
14 down_revision = '04f13e3c2f7e'
15 branch_labels = None
16 depends_on = None
17  
18  
19 def upgrade():
20     # ### commands auto generated by Alembic - please adjust! ###
21     op.create_table('user',
22     sa.Column('id', sa.Integer(), nullable=False),
23     sa.Column('username', sa.String(length=64), nullable=True),
24     sa.Column('email', sa.String(length=120), nullable=True),
25     sa.Column('password_hash', sa.String(length=128), nullable=True),
26     sa.PrimaryKeyConstraint('id')
27     )
28     op.create_index(op.f('ix_user_email'), 'user', ['email'], unique=True)
29     op.create_index(op.f('ix_user_username'), 'user', ['username'], unique=True)
30     # ### end Alembic commands ###
31  
32  
33 def downgrade():
34     # ### commands auto generated by Alembic - please adjust! ###
35     op.drop_index(op.f('ix_user_username'), table_name='user')
36     op.drop_index(op.f('ix_user_email'), table_name='user')
37     op.drop_table('user')
38     # ### end Alembic commands ###

 

 
6)結論
    對模型的任何修改,都要再執行flask db migrate, flask db upgrade
    這裏作的任何的更新,實際上都是把模型和數據庫當前的狀態作比較的
    並且歷次的版本都有,因此實際上能夠回退到以前的任何一個版本。
    
    這個思路其實挺好,這就是咱們以前寫數據庫補丁腳本的思路,一環套一環,只不過以前是靠人的,如今是靠程序自動生成的。
    並且他這裏更好的地方是,不但支持upgrade,還支持downgrade
相關文章
相關標籤/搜索