将主alembic 文件夹保留在主包文件夹中的一种方法是将alembic 文件夹视为要与主包一起安装的自己的包。
为此,您必须重命名它(它不能称为alembic,因为它将是一个顶级包,所以需要一个唯一的名称 - 我用过migrations),并添加一个@987654323 @alembic 文件夹和版本文件夹中的文件。
在部署时运行迁移需要知道已安装包的路径 - 一种简单的方法是提供应用迁移的控制台脚本。
所以项目结构如下:
<project root>
├── setup.py
├── mypackage
│ └── <project source files...>
│
├── migrations
│ ├── __init__.py
│ ├── alembic.ini
│ ├── apply.py
│ ├── env.py
│ ├── README
│ ├── script.py.mako
│ └── versions
│ ├── __init__.py
│ ├── 58c8dcd5fbdc_revision_1.py
│ └── ec385b47da23_revision_2.py
│
└── <other files and dirs>
还有setup.py:
from setuptools import find_packages
from setuptools import setup
setup(
name='mypackage',
packages=find_packages(exclude=('tests',)),
package_data={'migrations': ['alembic.ini']},
entry_points={
'console_scripts': ['apply-migrations=migrations.apply:main'],
},
install_requires=[
"SQLAlchemy==1.3.0",
"alembic==1.0.10",
# ...
]
)
最后是migrations/apply.py:
# Python script that will apply the migrations up to head
import alembic.config
import os
here = os.path.dirname(os.path.abspath(__file__))
alembic_args = [
'-c', os.path.join(here, 'alembic.ini'),
'upgrade', 'head'
]
def main():
alembic.config.main(argv=alembic_args)
现在安装轮子后,您将拥有一个可以直接调用的命令apply-migrations。请注意,我在这里实现的版本没有任何参数 - 尽管如果你想通过例如。 --sqlalchemy.url 可以添加到alembic_args。
我个人更喜欢将网址设置为migrations/env.py。例如,如果您有一个名为 SQLACLHEMYURL 的环境变量,您可以将其添加到 migrations/env.py:
import os
config.set_main_options(os.getenv('SQLALCHEMYURL'))
然后你可以调用:
SQLALCHEMYURL=... apply-migrations
在部署中。