跳转到主要内容

对Distutils的贡献

项目描述

Python包 distcontrib-migrate 为Distutils提供实用函数,扩展其功能,例如数据库管理功能和数据库迁移功能。

distcontrib-migrate 存在的主要原因是在处理数据库管理和模式迁移时使生活变得更加容易。通过将 distcontrib-migrate 集成到您的 setup.py 文件中,您将能够通过强大的包 sqlalchemysqlalchemy-migrate 为您执行这些任务。

另请参阅:distcontrib

使用方法

以下是一个使用 distcontribdistcontrib-migratesetup.py 文件示例

#!/usr/bin/env python

from distutils.core import setup
from Cython.Distutils import build_ext as cython_build
import distcontrib.tools as du
import distcontrib_migrate.api as dm

 ##
# This block contains settings you will eventually need to change
###

import myapp as myapp   #--- adjust to your package name

PACKAGE      = myapp.pkg_name
VERSION      = myapp.pkg_version
DESCRIPTION  = myapp.pkg_description
LICENSE      = myapp.pkg_license
URL          = myapp.pkg_url
AUTHOR       = myapp.pkg_author
AUTHOR_EMAIL = myapp.pkg_email
KEYWORDS     = myapp.pkg_keywords
REQUIREMENTS = myapp.pkg_requirements
LONG_DESCRIPTION = du.tools.read('README')
CLASSIFIERS      = [ 'License :: ' + LICENSE,
                     'Operating System :: OS Independent',
                     'Programming Language :: Python',
                     'Programming Language :: Cython',
                     'Development Status :: 3 - Alpha',
                     'Intended Audience :: Developers',
                     'Environment :: Console' ]

 ##
# From this point on, it's unlikely you will be changing anything.
###

PACKAGES      = find_packages(exclude=["*.tests", "*.tests.*", "tests.*", "tests"])
PACKAGES_DATA = du.tools.findall_package_data(PACKAGES)
EXT_MODULES   = du.tools.find_ext_modules(PACKAGES)

setup(
    name=PACKAGE,
    version=VERSION,
    description=DESCRIPTION,
    url=URL,
    author=AUTHOR,
    author_email=AUTHOR_EMAIL,
    long_description=LONG_DESCRIPTION,
    license=LICENSE,
    keywords=KEYWORDS,
    classifiers=CLASSIFIERS,
    packages=PACKAGES,
    package_data=PACKAGES_DATA,
    cmdclass={ 'build_ext' : cython_build,
               'doctest'   : du.doctests,
               'zap'       : du.zap,
               'migrate'   : dm.migrate,
               'psql'      : dm.psql, },
    ext_modules=EXT_MODULES,
    # install_requires=REQUIREMENTS
)

然后在您的 myapp/__init__.py 文件中创建以下内容

#!/usr/bin/env python

pkg_name         = __name__ if __package__ is None else __package__
pkg_description  = 'This application does everything you can imagine'
pkg_version      = '0.1.0'
pkg_license      = 'OSI Approved :: BSD License'
pkg_url          = 'http://' + pkg_name + '.readthedocs.org/'
pkg_author       = 'Richard Gomes http://rgomes-info.blogspot.com'
pkg_email        = 'rgomes.info@gmail.com'
pkg_keywords     = [ 'artificial','intelligence','magic','sorcery','voodoo' ]
pkg_requirements = [ 'lxml', 'sqlalchemy' ]

需求

数据库管理功能需要 sudo 权限。

对迫不及待的人的快速指南

在以下所有示例中,请注意,您始终可以指定 --url 参数。如果没有指定,默认值是

postgresql://${USER}@localhost:5432/sample

您可以从命令行轻松创建用户

$ python setup.py psql --createuser         # creates an user in the database
$ python setup.py psql --dropdb             # drops user and all owned objects
$ python setup.py psql --dropdb --createdb  # drops and creates an user in one go

然后您可以从命令行轻松创建Postgres数据库

$ python setup.py psql --createdb           # creates a database
$ python setup.py psql --dropdb             # drops a database
$ python setup.py psql --dropdb --createdb  # drops and creates a database in one go

您可以查询模型版本和数据库版本

$ python setup.py migrate --status --url postgresql://${USER}@localhost:5432/sample  # show model and database versions
$ python setup.py migrate --status                                                   # same as above

您可以从命令行轻松执行数据库的升级和降级

$ python setup.py migrate --upgrade --url postgresql://${USER}@localhost:5432/sample   # upgrade database
$ python setup.py migrate --upgrade                                                    # same as above
$ python setup.py migrate --upgrade --changeset=17                                     # upgrade to database version 17
$ python setup.py migrate --downgrade --url postgresql://${USER}@localhost:5432/sample   # downgrade database
$ python setup.py migrate --downgrade                                                    # same as above
$ python setup.py migrate --downgrade --changeset=15                                     # downgrade to database version 15

为了测试升级/降级脚本,您可以这样做

$ python setup.py migrate --test

如果您有一个现有的数据库,您想要逆向工程其模型,您可以尝试这样做

$ STAGING_URL=postgresql://admin@staging.example.com:5432/crm_staging
$ python setup.py migrate --status       --url=${STAGING_URL}
Model version:    0
Database version: 17
$ python setup.py migrate --create-model --url=${STAGING_URL} # reverse engineering to repository "admin" (the default)
$ python setup.py migrate --status       --url=${STAGING_URL}
Model version:   1
Database version: 17

现在将您获得的模型应用到全新的数据库中

$ DEVEL_URL=postgresql://localhost:5432/sandbox
$ python setup.py psql --createuser --url=${DEVEL_URL}
$ python setup.py psql --createdb   --url=${DEVEL_URL}
$ python setup.py migrate --status  --url=${DEVEL_URL}
Model version:    1
Database version: 0
$ python setup.py migrate --upgrade --url=${DEVEL_URL}
$ python setup.py migrate --status  --url=${DEVEL_URL}
Model version:    1
Database version: 1

概念

这里展示的所有概念都必须从 迁移 命令的角度来理解,这意味着它们的范围比通常要窄得多。

迁移脚本

迁移脚本是一个Python程序,它基本上只有两个功能: 升级降级。下面是一个迁移脚本的示例

from sqlalchemy import *
meta = MetaData()

exchange_codes = Table('exchange_codes', meta,
    Column('mic', String, primary_key=True, nullable=False),
    Column('country', String, nullable=False),
    Column('iso3166', String, nullable=False),
    Column('omic', String, nullable=False),
    Column('os', String, nullable=False),
    Column('name', String, nullable=False),
    Column('acronym', String, nullable=False),
    Column('city', String, nullable=False),
    Column('url', String, nullable=False),
    Column('status', String, nullable=False),
    Column('sdata', String, nullable=False),
    Column('cdate', String, nullable=False),
    Column('comments', String, nullable=False),
)

def upgrade(migrate_engine):
    meta.bind = migrate_engine
    exchange_codes.create(meta.bind)

def downgrade(migrate_engine):
    meta.bind = migrate_engine
    exchange_codes.drop(meta.bind)

有关更多信息,请参阅 sqlalchemy-migrate

模型版本

模型由一组迁移脚本组成。

假设您正在创建CRM应用程序。您首先在数据库中表示人员。您认为对于一个人来说,最初只需要 nameSSN。随着时间的推移,您还需要在数据库中表示部门。然后您意识到您需要将人员和部门联系起来。您的模型将经历三个迭代

  • 001_creating_table_person

  • 002_creating_table_department

  • 003_linking_people_and_departments

换句话说,您的模型由三个迁移脚本组成。当您运行 migrate --status 命令时,它基本上告诉您您定义了多少个迁移脚本。

数据库版本

假设您已经定义了一个由三个迁移脚本组成的模型,如上所述。假设您创建了一个空数据库,这意味着还没有应用迁移脚本。在这种情况下,migrate --status 命令将显示

$ python setup.py migrate --status
Model version:    3
Database version: 0

现在假设您已应用了两个迁移脚本,因为您仍在编写将人员和部门联系起来的代码。 migrate --status 命令将显示

$ python setup.py migrate --upgrade --changeset=2
$ python setup.py migrate --status
Model version:    3
Database version: 2

仓库

仓库是存储模型的文件系统位置。仓库由控制文件组成,这些文件是 自动 为您创建的,包括迁移脚本。您不需要担心创建仓库,因为它是您第一次运行 migrate --status 命令时创建的。

创建空模型

假设您是从零开始

$ python setup.py migrate --status
Model version:    0
Database version: 0

在上面的示例中,一个新的仓库在 admin 目录下创建。您可以通过传递 --scripts 参数来选择另一个目录名,如下所示

$ python setup.py migrate --status --scripts=woodpecker
Model version:    0
Database version: 0

使用逆向工程创建模型

命令 migrate --create-model 从可访问的连接URL中的现有数据库中检索数据库模式,并在给定的存储库上创建一个新的迁移脚本。例如:

$ STAGING_URL=postgresql://admin@staging.example.com:5432/crm_staging
$ python setup.py migrate --status       --url=${STAGING_URL}
Model version:    0
Database version: 17

$ python setup.py migrate --create-model --url=${STAGING_URL} # reverse engineering to repository "admin" (the default)
$ python setup.py migrate --status       --url=${STAGING_URL}
Model version:    1
Database version: 17

此功能依赖于 sqlalchemy-migrate,并且被视为实验性的。如果您发现问题,请向 sqlalchemy-migrate 用户邮件列表 报告。

身份验证

命令 migratepsql 也会遵守将Postgres数据库密码存储在文件 ~/.pgpass 中的约定。第一次尝试访问未在 ~/.pgpass 中存储密码的数据库时,您将被提示输入密码,并且它将被存储在文件中。

已知问题和限制

  • (问题 1208083):在全新环境中使用 pip 进行安装可能会失败。解决方案:尝试第二次安装应能正常工作。

    $ pip install sqlalchemy-migrate   # eventually may fail
    $ pip install sqlalchemy-migrate   # expected to suceed
  • 数据库管理函数(createuser,dropuser,createdb,dropdb)目前仅支持Postgres数据库。然而,数据库迁移支持sqlalchemy支持的所有数据库。

支持

项目详情


下载文件

下载您平台的文件。如果您不确定选择哪个,请了解有关 安装包 的更多信息。

源代码发行版

distcontrib-migrate-0.1.1.tar.gz (12.9 kB 查看哈希)

由以下机构支持