alembic可以处理sqlalchemy定义的数据库的升级.
1. 生成可配置的升级脚本 alembic init update
.
├── alembic.ini
└── update
├── env.py
├── env.pyc
├── README
├── script.py.mako
└── versions
2. 编辑alembic.ini文件来建立alembic与数据库实体之间的关联
sqlalchemy.url = driver://user:pass@localhost/dbname
改成和自己的数据库engine相对应
3. 编辑env.py来与sqlalchemy建立关联
sqlalchemy定义了数据库与类之间的映射, 为了关联alembic与sqlalchemy, 需要修改target_metadata = None
在定义数据库表时, 我们需要继承Base = declarative_base(), 这时可以改成target_metadata = Base.metadata即可. 如果是用的elixir库, 可以改成target_metadata = elixir.metadata
4. alembic处理升级
alembic在处理数据库升级时, 需要知道当前的数据库更新到了哪个升级脚本, 在数据库中会有alembic_version
记录这一项, 如果没有的话, 需要运行alembic history
来查看当前的脚本之间的前后继关系
c13aac80dc0d -> a6bd6b66dc68 (head), v1.0.6
8af8ba526412 -> c13aac80dc0d, 12_27
c07041b991dd -> 8af8ba526412, v1.0.4
d9e1223a5cc6 -> c07041b991dd, 002_update_for_12.2
<base> -> d9e1223a5cc6, v1.0.2
如果我确定我当前的数据库是由c13aac80dc0d对应的脚本升级上来的, 那么执行alembic stamp c13aac80dc0d
来更新数据库, 表明当前数据库对应到了这个脚本, 此时可以执行alembic current
来查看确实是这个
版本.
之后, 可以基于当前的数据库与我们已经定义好的表之间自动生成升级脚本alembic revision --autogenerate -m "create update files"
, 可能还需要改一些语句, 或者数据库表之间的关系的调整还涉及到数据>记录的内容更改与填充.
5. 升降级命令
alembic upgrade +1
alembic downgrade -1
6. 建议
不要自己去写python或者Sql脚本创建数据库实体, 建议从一开始就用alembic操作数据库. 就是说在项目里面跟数据库相关的操作, 只需要定义好了orm, 之后代码里面做增删查改就够了. 其它的创建数据库, 创建表
, 更改表结构的操作都由alembic来接管.