Python使用Setuptools打包Alembic迁移

2024-09-28 01:23:50 发布

您现在位置:Python中文网/ 问答频道 /正文

在Setuptoolssetup.py文件中打包Alembic迁移文件的正确方法是什么?所有内容都在我的repo根目录中alembic/。在

这是一个Python应用程序,不是一个库。在

我想要的安装流程是有人可以pip install我的应用程序。然后,它们就可以通过运行<app> alembic upgrade --sqlalchemy.url=<db_url>之类的程序来初始化应用程序数据库。升级将需要一个pip install -U,之后可以再次运行Alembic命令。在

这是非正统的吗?在

如果没有,我该怎么做?当然是console_scriptsentry_points。但除此之外?在


Tags: installpip文件方法pyapp应用程序url
2条回答

我不确定这是否正确,但我是这样做的:

首先,可以使用-x选项向alembic添加一些自定义选项,并且可以在this great answer中找到详细说明。{cd2>中的{。在

然后,我将alembic.ini文件和alembic目录从项目根目录移动到顶层python包,从而成功地打包了alembic和我的迁移:

<project root>
├── src
│   └── <top-level package dir>
│       ├── alembic
│       │   ├── env.py
│       │   ├── README
│       │   ├── script.py.mako
│       │   └── versions
│       │       ├── 58c8dcd5fbdc_revision_1.py
│       │       └── ec385b47da23_revision_2.py
│       ├── alembic.ini
│       ├── __init__.py
│       └── <other files and dirs>
└── <other files and dirs>

这允许在mysetup.py中使用setuptoolspackage_data指令:

^{pr2}$

A此时,alembic配置和修订被正确打包,但是alembic.ini设置必须调整以反映新的目录树。可以使用%(here)s参数完成,该参数包含包含alembic.ini文件的目录的绝对路径:

# A generic, single database configuration.

[alembic]
# path to migration scripts
script_location = %(here)s/alembic

[...]

# version location specification; this defaults
# to alembic/versions.  When using multiple version
# directories, initial revisions must be specified with  version-path
# version_locations = %(here)s/bar %(here)s/bat alembic/versions
version_locations = %(here)s/alembic/versions

[...]

最后,必须使用alembic选项调用alembic,该选项允许提供配置文件的路径:

alembic -c <path to alembic.ini> ...

这样做的一个方法是保持主alembic文件夹沿着主包文件夹,是把alembic文件夹当作它自己的包安装在主包旁边。在

为此,您必须重命名它(它不能被称为alembic,因为它将是一个顶级包,所以需要一个唯一的名称—我使用了migrations),并在alembic文件夹和versions文件夹中添加一个__init__.py文件。在

在部署时运行迁移需要知道已安装包的路径—一个简单的方法是提供一个应用迁移的控制台脚本。在

项目结构如下:

<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

^{pr2}$

最后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中设置url。例如,如果您有一个名为SQLACLHEMYURL的环境变量,您可以在migrations/env.py中添加以下内容:

import os
config.set_main_options(os.getenv('SQLALCHEMYURL'))

然后您可以调用:

SQLALCHEMYURL=... apply-migrations

关于堕落。在

相关问题 更多 >

    热门问题