Alembic 速查笔记

2019/04/25 21:15 下午 posted in  Python

Alembic 命令行

初始化

$ cd yourproject
$ alembic init alembic

创建一次 alembic

alembic revision -m "***"

upgrade / downgrade

alembic upgrade head  # 升级到最新版本
alembic upgrade +2
alembic downgrade -1
alembic downgrade base  # 回退到最开始的版本

获取 alembic 版本信息

alembic history
alembic current
alembic heads
alembic branches

自动生成

alembic revision --autogenerate -m "Added account table"

Alembic 语法

增加表

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')
    )

公式:

op.create_table(<表名>, sa.Column(<列名>, *属性))

删除表

def downgrade():
  ### commands auto generated by Alembic - please adjust! ###
  op.drop_table("account")
  ### end Alembic commands ###

公式:

op.drop_table(<表名>)

增加一列

from alembic import op
from sqlalchemy import Column,String
    
op.add_column('organization',
    Column('name',String())
)

公式:

op.add_column(<表名>, Column(<列名>, *属性))

删除一列

op.drop_column('organization','name' )

公式:

op.drop_column(<表名>, <列名>)

修改列属性

op.alter_column('user', 'name', new_column_name='username',
                    existing_type=mysql.VARCHAR(length=20))

公式:

alter_column(<表名>, <旧列名>, new_column_name=<新列名>, existing_type=<旧字段类型>, type_=<字段类型修改后>)

注:当表中有数据时,修改字段类型无效或报错

分批处理

with op.batch_alter_table("some_table") as batch_op:
    batch_op.add_column(Column('foo', Integer))
    batch_op.drop_column('bar')

执行 SQL 语句

sql="""ALTER TABLE actions alter column finished_at type float;"""
conn=op.get_bind()
conn.execute(sql)

插入数据

# 在已有表内插入数据
from alembic import op
from sqlalchemy.sql import table,column
from sqlalchemy import String, Integer, Date
    
#Create an ad-hoc table to use for the insert statement.
accounts_table=table('test',
    column('id',Integer),
    column('name',String),
)
    
op.bulk_insert(accounts_table,
    [
        {'id':1,'name':'JohnSmith'},
        {'id':2,'name':'EdWilliams'},
        {'id':3,'name':'WendyJones'},
    ]
)

更新版本,但不操作实际的 upgrade 内容(慎用)

alembic stamp head