首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python -使用Setuptools打包Alembic迁移

Python -使用Setuptools打包Alembic迁移
EN

Stack Overflow用户
提问于 2017-02-22 13:29:37
回答 2查看 2.4K关注 0票数 18

在Setuptools setup.py文件中打包Alembic迁移文件的正确方式是什么?所有内容都在我的存储库根目录中,名为alembic/

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

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

这是不是很不正统?

如果不是,我将如何完成此任务?当然是console_scripts entry_points。但除此之外呢?

EN

回答 2

Stack Overflow用户

发布于 2018-07-12 18:12:33

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

首先,您可以使用-x选项向this great answer添加某种自定义选项,您可以在alembic中找到详细说明。这允许您在运行时指定db_url并使其覆盖config.ini中的值。

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

代码语言:javascript
复制
<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>

这允许在我的setup.py中使用setuptools package_data指令

代码语言:javascript
复制
setup(
    name=<package_name>,
    package_dir={'': 'src'},
    packages=find_packages(where='src'),
    package_data={
        '<top-level package dir>': ['alembic.ini', 'alembic/*', 'alembic/**/*'],
    },
    [...]
)  

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

代码语言:javascript
复制
# 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

[...]

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

代码语言:javascript
复制
alembic -c <path to alembic.ini> ...
票数 7
EN

Stack Overflow用户

发布于 2019-06-20 17:33:34

要做到这一点,一种方法是将alembic文件夹保留在主包文件夹中,将alembic文件夹视为它自己的包,与您的主包一起安装。

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

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

因此,项目结构如下所示:

代码语言:javascript
复制
<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

代码语言:javascript
复制
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

代码语言:javascript
复制
# 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。注意,我在这里实现的版本没有任何参数-尽管如果你想传递例如。你可以在alembic_args中添加它。

就我个人而言,我更喜欢在migrations/env.py中设置url。例如,如果您有一个名为SQLACLHEMYURL的环境变量,则可以在migrations/env.py中添加以下内容

代码语言:javascript
复制
import os
config.set_main_options(os.getenv('SQLALCHEMYURL'))

然后,您可以调用:

代码语言:javascript
复制
SQLALCHEMYURL=... apply-migrations

在枯竭的时候。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42383400

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档