alembic提供關於某個數據庫的創建,管理,調用變化管理脚本,使用sqlalchemy作爲底層的驅動。
使用alembic開始與創建Migration環境,Migration環境僅僅創建一次,之後通過應用的源碼來管理操作。環境的創建使用alembic的init命令。然後根據應用的特定需求來定製。這種特定環境的結構如下:
yourproject/
alembic/
env.py
README
script.py.mako
versions/
3512b954651e_add_account.py
2b1ae634e5cd_add_order_id.py
3adcc9a56557_rename_username_field.py
有個基本的瞭解后,,我們可以創建一個使用init命令,
cd yourprojectpath
alembic init alembic
alembic list_templates 可列出所有環境模板。
特定模板的使用通過命令alembic init --template pylons ./scripts
編輯.ini文件,特定section,配置特定的功能,具體參考官文。
創建一個Migration脚本,有了環境,我們就可以創建revision,命令:
alembic revision -m "create account table"
一個新的文件就會產生,類似1975ea83b712_create_account_table.py内容如下:
""create account table
Revision ID: 1975ea83b712
Revises:
Create Date: 2011-11-08 11:40:27.089406"""
# revision identifiers, used by Alembic.
revision='1975ea83b712'
down_revision=None
branch_labels=None
from alembic import op
import sqlalchemy as sa
def upgrade():
pass
def downgrade():
pass
我們的工作就是改寫upgrade和downgrade函數的内容,來提供一個變化集合對於我們的數據庫。
注意一下down_revision這個變量,他的作用是操作migration時,知道特定的 順序,打個比方,現在我們的revision='1975ea83b712',儅我們創建下一個revison后,新產生的文件中變量down_revision的值為‘1975ea83b712‘,意指當前的revison.
儅我們使用命令alembic revision -m "Add a column",產生一個新的revision后,我們都可以使用命令alembic upgrade head升級到當前的revision.
命令alembic current可以獲取到當前revision的版本信息。
命令alembic history --verbose可以獲取到歷史版本的信息。-r + 範圍,可以查看特定範圍的版本信息:alembic history -r 1975ea:ae1027
命令alembic downgrade base,降級到最基礎的版本
自動生成Migration,首先,我們需要修改env.py文件,把target_metadata=None 改爲
from myapp.mymodel import Base
target_metadata = Base.metadata
之後在revision時,加入--autogenerate選項。例如:
alembic revision --autogenerate -m "Added account table"
這樣生成的revision文件,内容如下:
"""empty message
Revision ID: 27c6a30d7c24
Revises: None
Create Date: 2011-11-08 11:40:27.089406"""
# revision identifiers, used by Alembic.
revision='27c6a30d7c24'
down_revision=None
from alembic import op
import sqlalchemy as sa
def upgrade():
### commands auto generated by Alembic - please adjust! ###
op.create_table('account',
sa.Column('id',sa.Integer()),
sa.Column('name',sa.String(length=50),nullable=False),
sa.Column('description',sa.VARCHAR(200)),
sa.Column('last_transaction_date',sa.DateTime()),
sa.PrimaryKeyConstraint('id')
)
### end Alembic commands ###
def downgrade():
### commands auto generated by Alembic - please adjust! ###
op.drop_table("account")
### end Alembic commands ###
上述命令会产生verison目录下一个脚本,该脚本的作用是用来对当前数据库状态进行新的更新升级,或者降级操作,一般情况下,我们在对数据库表的字段做出更改后,先执行alembic revision --autogenerate -m "备注"命令,然后再执行alembic upgrade head 命令,那么当前数据库表格的状态和字段为最新更改后的!