1. 程式人生 > 實用技巧 >通過 alembic 重命名錶列名(Model欄位名)

通過 alembic 重命名錶列名(Model欄位名)

為什麼要特意講一下這個,是因為 alembic 無法自動檢測是否對欄位名進行了重新命名操作,需要我們手動新增相關語句。

假設有下面這樣一個 Model

class User(Base):
    __tablename__ = 'user'

    id = Column(Integer, primary_key=True)
    name = Column(String(20))

我們現在想要把name欄位改名為username, 通過alembic revision--autogenerate無法實現我們的目的:

INFO  [alembic.migration] Context impl MySQLImpl.
INFO  [alembic.migration] Will assume non-transactional DDL.
INFO  [alembic.autogenerate.compare] Detected added column 'user.username'
INFO  [alembic.autogenerate.compare] Detected removed column 'user.name'
  Generating /home/xx/alembic/versions/4475103466d3_rename_user_name_to_username.py .
.. done

上面的檢測結果明顯不是我們想要的,需要手動更改生成的 version 檔案:

from sqlalchemy.dialects import mysql

def upgrade():
    ### commands auto generated by Alembic - please adjust! ###
    # 把 user 表裡的 name 列重新命名為 username
    op.alter_column('user', 'name', new_column_name='username',
                    existing_type=mysql.VARCHAR(length=20))
    ### end Alembic commands ###


def downgrade():
    ### commands auto generated by Alembic - please adjust! ###
    op.alter_column('user', 'username', new_column_name='name',
                    existing_type=mysql.VARCHAR(length=20))
    ### end Alembic commands ###

alemblic upgrade命令結果:

$ alembic upgrade 549c504fe1b5:4475103466d3 --sql
INFO  [alembic.migration] Context impl MySQLImpl.
INFO  [alembic.migration] Generating static SQL
INFO  [alembic.migration] Will assume non-transactional DDL.
INFO  [alembic.migration] Running upgrade 549c504fe1b5 -> 4475103466d3, rename User.name to username
-- Running upgrade 549c504fe1b5 -> 4475103466d3

ALTER TABLE user CHANGE name username VARCHAR(20) NULL;

UPDATE alembic_version SET version_num='4475103466d3';

可以看到生成的 sql 語句就是我們想要的結果。

通過alter_column方法進行重新命名的基本用法就是alter_column('表名','先有的列名',new_column_name='重新命名後的列名',existring_type=欄位型別)

通過alter_column方法可以更多的ALTER TABLE操作,詳見文件

參考