Alembic 是用來(lái)完成 SQLalchemy 數(shù)據(jù)表遷移的工具,同時(shí)也提供了自動(dòng)生成遷移的選項(xiàng)來(lái)簡(jiǎn)化工作政敢。不過(guò)在和 SQLite 協(xié)作時(shí)原茅,由于SQLite并不是支持所有的SQL命令,所以有一些需要注意的地方堕仔,記在這里擂橘。
啟用Alembic
具體見(jiàn)文檔,主要有以下幾步
- 初始化環(huán)境
- 修改ini文件摩骨,最主要的一項(xiàng)是把DB的位置改對(duì)通贞。
然后就可以寫(xiě)migrate腳本了朗若。
啟用 AutoGenerate
上面教程頁(yè)面中的Migration需要自己寫(xiě),不過(guò)Alembic還提供了自動(dòng)生成Migration的選項(xiàng)昌罩,首先上文檔哭懈。
如果需要支持auto,需要做下面的幾件事情:
- 在
alembic/env.py
中找target_metadata
茎用,默認(rèn)生成的是這樣:
# add your model's MetaData object here
# for 'autogenerate' support
# from myapp import mymodel
# target_metadata = mymodel.Base.metadata
target_metadata = None
看注釋遣总,如果需要支持autogenerate
,把代碼改成注釋中的樣子轨功。注意旭斥,如果Base不是放在根目錄下,而是在子目錄中的古涧,像我這個(gè)的結(jié)構(gòu):
.
├── README.md
├── alembic
│ ├── README
│ ├── env.py
│ ├── script.py.mako
│ └── versions
│ └── XXXXXXXX_foobar.py
├── alembic.ini
├── db
│ └── foobar.db
├── foo.py
├── main.py
├── models
│ ├── __init__.py
│ ├── base.py
│ └── foobar.py
└── requirements.txt
則需要在導(dǎo)入Base前加上這兩句:
import os, sys
sys.path.append(os.getcwd())
要不然報(bào)找不到的錯(cuò)垂券,嗯。
- 改Model
- 運(yùn)行
alembic revision --autogenerate -m "blah blah blah ..."
在運(yùn)行成功后羡滑,會(huì)在versions目錄下生成一個(gè)新的migration菇爪,所有自動(dòng)生成的語(yǔ)句都會(huì)放在注釋中間方便review。
和SQLite一起用
由于SQLite支持的SQL命令不全柒昏,所以有些命令凳宙,如ALTER TABLE
之類的不能用。好在Alembic在版本0.7.0后职祷,增加了batch的選項(xiàng)氏涩,它會(huì)根據(jù)新的Model創(chuàng)建一個(gè)Schema,然后把老的數(shù)據(jù)移過(guò)來(lái)堪旧。具體的做法就是在 alembic/env.py
的函數(shù) run_migrations_online
函數(shù)中,找到 context.configure()
函數(shù)奖亚,在其中加入 render_as_batch=True
選項(xiàng)即可淳梦。不過(guò)在github上看到一個(gè)更靈活的辦法:
context.configure(
connection=connection,
target_metadata=target_metadata,
render_as_batch=config.get_main_option('sqlalchemy.url').startswith('sqlite:///'),
)
這樣只在sqlite數(shù)據(jù)庫(kù)的時(shí)候會(huì)用batch,其它就不會(huì)了昔字。
暫時(shí)就這些爆袍,反正只是保證能用了,也沒(méi)管后面的原理作郭,回頭有需求的話再深挖吧陨囊。