跳转到主要内容

用于迁移postgresql数据库的Python包

项目描述

https://travis-ci.org/karenc/db-migrator.svg?branch=master https://coveralls.io/repos/github/karenc/db-migrator/badge.svg?branch=master

设置

dbmigrator 需要一些设置才能运行

  • --migrations-directory: 包含所有迁移的目录

  • --context: 包含迁移目录入口点的Python包名称

  • --db-connection-string: 连接到postgres的数据库主机、端口、名称、用户、密码等

  • --config: 包含上述设置的配置文件

查看 dbmigrator -h.

要使用入口点设置迁移目录,在 mymodule setup.py

setup(
    ...
    entry_points={
        'dbmigrator': [
            'migrations_directory = mymodule.main:migrations_directory',
            ],
        },
    )

重要提示: 在运行 dbmigrator 之前,首先运行 python setup.py developpython setup.py install,以便从 setup.py 中获取设置。

然后在 mymodule/main.py

import os

migrations_directory = '{}/sql/migrations'.format(
    os.path.abspath(os.path.dirname(__file__)))

或者

import os

def migrations_directory():
    return '{}/sql/migrations'.format(
        os.path.abspath(os.path.dirname(__file__)))

或者使用配置文件,development.ini,如下所示

[app:main]
db-connection-string = postgres://dbuser@localhost/dbname

生成

在迁移目录中生成迁移脚本。

示例用法

dbmigrator generate add_id_to_users

生成一个名为 migrations/20151217170514_add_id_to_users.py 的文件,其内容为:

# Uncomment should_run if this is a repeat migration
# def should_run(cursor):
#     # TODO return True if migration should run


def up(cursor):
    # TODO migration code
    pass


def down(cursor):
    # TODO rollback code
    pass

init

初始化模式迁移表。默认情况下,假定所有迁移都已应用到数据库中。

示例用法

dbmigrator --db-connection-string='postgres://dbuser@localhost/dbname' init

可以选择手动设置数据库版本。例如,如果没有任何迁移应用到数据库中,你可以

dbmigrator --config=development.ini init --version=0

list

列出迁移版本、名称、是否已应用以及应用日期。

示例用法

$ dbmigrator --config=development.ini list
version        | name            | is applied | date applied
----------------------------------------------------------------------
20151217170514   add_id_to_users   True         2016-01-31 00:15:01.692570+01:00
20151218145832   add_karen_to_us   False*
20160107200351   blah              deferred

在“是否已应用”列中的 * 表示迁移是重复迁移。

要查看完整的迁移名称,请使用 --wide

$ dbmigrator --config=development.ini list --wide
version        | name               | is applied | date applied
----------------------------------------------------------------------
20151217170514   add_id_to_users      True         2016-01-31 00:15:01.692570+01:00
20151218145832   add_karen_to_users   False*
20160107200351   blah                 deferred

migrate

运行挂起的迁移。

例如,在迁移目录中有两个迁移

migrations/20151217170514_add_id_to_users.py:

from dbmigrator import super_user

def up(cursor):
    # TODO migration code
    pass

    # if a super user database connection is needed
    with super_user() as super_cursor:
        pass

def down(cursor):
    # TODO rollback code
    pass

migrations/20151218145832_add_karen_to_users.py:

def up(cursor):
    cursor.execute('ALTER TABLE users ADD COLUMN karen TEXT')

def down(cursor):
    cursor.execute('ALTER TABLE users DROP COLUMN karen')

要运行迁移

$ dbmigrator migrate
Running migration 20151217170514 add_id_to_users

Running migration 20151218145832 add_karen_to_users
---
+++
@@ -4005,21 +4005,22 @@
     first_name text,
     firstname text,
     last_name text,
     surname text,
     full_name text,
     fullname text,
     suffix text,
     title text,
     email text,
     website text,
-    is_moderated boolean
+    is_moderated boolean,
+    karen text
 );

 ALTER TABLE public.users OWNER TO rhaptos;

 --
 -- Name: abstractid; Type: DEFAULT; Schema: public; Owner: rhaptos
 --

 ALTER TABLE ONLY abstracts ALTER COLUMN abstractid SET DEFAULT nextval('abstracts_abstractid_seq'::regclass);

或要运行到特定版本的迁移

$ dbmigrator migrate version=20151217170514
Running migration 20151217170514 add_id_to_users

如果所有迁移都已运行

$ dbmigrator migrate
No pending migrations.  Database is up to date.

要编写重复迁移,确保你的迁移已定义 should_run

def should_run(cursor):
    return os.path.exists('data.txt')


def up(cursor):
    with open('data.txt') as f:
        data = f.read()
    cursor.execute('INSERT INTO table VALUES (%s)', (data,))


def down(cursor):
    pass

上述迁移将在每次调用 migrate 时运行,除非它被标记为“延迟”。如果 should_run 返回 True,则运行 up

要编写延迟迁移,请将 @deferred 添加到 up 函数中

from dbmigrator import deferred


@deferred
def up(cursor):
    # this migration is automatically deferred

上述迁移将不会运行,除非你使用 migrate --run-deferred

rollback

回滚迁移。

例如,在迁移目录中有两个迁移

migrations/20151217170514_add_id_to_users.py:

def up(cursor):
    # TODO migration code
    pass

def down(cursor):
    # TODO rollback code
    pass

migrations/20151218145832_add_karen_to_users.py:

def up(cursor):
    cursor.execute('ALTER TABLE users ADD COLUMN karen TEXT')

def down(cursor):
    cursor.execute('ALTER TABLE users DROP COLUMN karen')

确保数据库是最新的

$ dbmigrator migrate
No pending migrations.  Database is up to date.

现在回滚最后一个迁移

$ dbmigrator rollback
Rolling back migration 20151218145832 add_karen_to_users
---
+++
@@ -4005,22 +4005,21 @@
     first_name text,
     firstname text,
     last_name text,
     surname text,
     full_name text,
     fullname text,
     suffix text,
     title text,
     email text,
     website text,
-    is_moderated boolean,
-    karen text
+    is_moderated boolean
 );

 ALTER TABLE public.users OWNER TO rhaptos;

 --
 -- Name: abstractid; Type: DEFAULT; Schema: public; Owner: rhaptos
 --

 ALTER TABLE ONLY abstracts ALTER COLUMN abstractid SET DEFAULT nextval('abstracts_abstractid_seq'::regclass);

要回滚最后两个迁移

$ dbmigrator rollback --steps=2
Rolling back migration 20151218145832 add_karen_to_users
---
+++
@@ -4005,22 +4005,21 @@
     first_name text,
     firstname text,
     last_name text,
     surname text,
     full_name text,
     fullname text,
     suffix text,
     title text,
     email text,
     website text,
-    is_moderated boolean,
-    karen text
+    is_moderated boolean
 );

 ALTER TABLE public.users OWNER TO rhaptos;

 --
 -- Name: abstractid; Type: DEFAULT; Schema: public; Owner: rhaptos
 --

 ALTER TABLE ONLY abstracts ALTER COLUMN abstractid SET DEFAULT nextval('abstracts_abstractid_seq'::regclass);

Rolling back migration 20151217170514 add_id_to_users

mark

将迁移标记为已完成、未完成或延迟。

示例用法

$ dbmigrator --config=development.ini --migrations-directory=migrations/ list
name                      | is applied | date applied
----------------------------------------------------------------------
20151217170514_add_id_to_   True         2016-01-31 00:15:01.692570+01:00
20151218145832_add_karen_   False
20160107200351_blah         False

要将迁移标记为未完成

$ dbmigrator --config=development.ini --migrations-directory=migrations/ mark -f 20151217170514
Migration 20151217170514 marked as not been run

$ dbmigrator --config=development.ini --migrations-directory=migrations/ list
name                      | is applied | date applied
----------------------------------------------------------------------
20151217170514_add_id_to_   False
20151218145832_add_karen_   False
20160107200351_blah         False

要将迁移标记为已完成

$ dbmigrator --config=development.ini --migrations-directory=migrations/ mark -f 20151217170514
Migration 20151217170514 marked as completed

$ dbmigrator --config=development.ini --migrations-directory=migrations/ list
name                      | is applied | date applied
----------------------------------------------------------------------
20151217170514_add_id_to_   True         2016-06-13 16:39:58.777893+01:00
20151218145832_add_karen_   False
20160107200351_blah         False

要将迁移标记为延迟意味着在运行 migraterollback 时忽略迁移

$ dbmigrator --config=development.ini --migrations-directory=migrations/ mark -d 20151217170514
Migration 20151217170514 marked as deferred

$ dbmigrator --config=development.ini --migrations-directory=migrations/ list
name                      | is applied | date applied
----------------------------------------------------------------------
20151217170514_add_id_to_   deferred     None
20151218145832_add_karen_   False
20160107200351_blah         False

CHANGELOG

1.1.0 (2018-01-03)

  • 将 db-config-ini-key 添加到 CLI 选项中

  • --sort(版本或已应用)添加到 dbmigrator list

  • 允许 mark 接受多个时间戳

  • 在运行 utils 测试之前设置 dbmigrator 设置

  • 添加静音开关

  • 添加无回滚迁移的测试

  • 将大多数输出转换为日志

  • 显式关闭所有 postgres 数据库连接

1.0.2 (2017-09-25)

  • 在 should_run 附近创建一个 savepoint - 回滚到 false 以恢复数据库状态

  • __version__ 添加到 dbmigrator

1.0.1 (2017-09-14)

  • 更新 psycopg2 所需的最小版本

1.0.0 (2017-08-24)

  • list 中添加“*”以指示重复迁移

  • 当找不到标记迁移时引发 SystemExit

  • 添加延迟迁移

  • 添加重复条件迁移

  • 将打印语句更改为 logger.debug

  • 在安装测试包时减少测试中的噪音

  • 添加回滚 CLI 测试

  • 添加迁移 CLI 测试

  • 添加超级用户数据库连接

  • 将 logger 从 __init__.py 移动到 utils.py

  • 在 .travis.yml 中将 python 3.4 更改为 3.5

0.2.0 (2016-06-24)

  • 添加 psycopg2 等待回调,以便按 Ctrl-C 停止迁移

  • 实现将迁移标记为延迟: mark -d

  • list 添加 –wide 选项以显示完整的迁移名称

  • 更新 README 中的命令用法

  • 向 dbmigrator 命令添加帮助信息

  • 如果模式迁移不存在,使用 dbmigrator init --help 警告用户

  • 添加生成迁移的 CLI 测试

0.1.4 (2016-05-12)

  • dbmigrator list 更改为分别列出版本和迁移名称

0.1.3 (2016-04-19)

  • 将 CLI 测试分成不同的测试用例

  • 将测试配置更改为使用travis数据库

  • 将logger.warn更改为logger.warning

  • 添加测试用例以测试CLI的verbose选项

  • 添加对dbmigrator list的测试

  • 添加针对多个上下文的CLI init测试用例

  • 将travis和coveralls徽章添加到README中

  • 将cli.main导入移动到基本测试用例

  • 重构代码,以标记迁移为完成或未完成

  • 添加标记迁移为完成或未完成的mark命令

  • 添加对mark命令的测试

  • 更新README,包含mark命令的示例用法

0.1.2 (2016-03-18)

  • bug:

    修复当未提供迁移目录时list不会崩溃的问题

  • 如果schema_migrations表不存在,则对list记录警告消息

  • --verbose更改为将记录器级别设置为调试

  • 添加对utils.timestamp的测试

  • 添加对utils.rollback_migration的测试

  • 添加对utils.run_migration的测试

  • 添加对utils.get_pending_migrations的测试

  • 添加对utils.get_migrations的测试

  • 添加对utils.import_migration的测试

  • 使dbmigrator generate生成符合PEP8的代码

  • 修复dbmigrator generate迁移目录查找问题

  • 添加对utils.with_cursor的测试

  • 添加对utils.get_settings_from_config的测试

  • 添加与测试包的集成测试

  • 将PEP8添加到travis

  • 为dbmigrator添加一个记录器,该记录器将写入stdout

  • 将版本信息选项更改为-V

  • 按文件名而不是完整路径对迁移进行排序

0.1.1 (2016-02-24)

  • 如果表已存在,则停止更改schema_migrations数据

  • 重写--version以使用argparse版本操作

  • 添加对--version的单元测试

  • 添加travis CI配置文件

  • 修复默认上下文(工作目录)是字符串而不是列表的问题

0.1.0 (2016-02-12)

  • 允许指定多个迁移目录/上下文

  • 添加–verbose,它将打印dbmigrator使用的配置

  • 使用datetime utcnow而不是now进行时间戳

  • 添加--version以显示安装的db-migrator版本

0.0.7 (2016-02-10)

  • 添加选项--context到dbmigrator以加载入口点

  • 如果指定了配置文件但找不到,则引发错误

0.0.6 (2016-02-08)

  • 修复“init”命令中缺失迁移目录的问题

0.0.5 (2016-02-08)

  • 将CHANGELOG包含在分发清单中

0.0.4 (2016-02-08)

  • 如果迁移目录未定义,则显示警告消息而不是错误

  • 添加CHANGELOG

0.0.3 (2016-02-08)

  • 如果迁移目录未定义,则返回错误

0.0.2 (2016-02-03)

  • 修复README中的无效rst

  • 更新setup.py描述和long_description

  • 更新setup.py以包括README作为描述并修复url

  • 在删除配置文件的默认值后更新README和cli

  • 删除默认配置路径(development.ini)

  • 添加dbmigrator list命令

  • 修复dbmigrator rollback以在没有迁移可以回滚时停止

  • 在初始化schema_migrations后打印消息

  • 如果使用入口点,请添加运行python setup.py install的注释

  • 在README中添加从setup.py入口点设置迁移目录设置的注释

  • 更新README中的init和generate命令名称

  • 从setup.py入口点获取设置

  • 在迁移目录中删除__init__.py的生成

  • 为dbmigrator init添加选项version以设置初始版本

  • 将“generate_migration”命令重命名为“generate”

  • 将“init_schema_migrations”命令重命名为“init”

  • 更改导入迁移的方式,使其在python2中工作

  • 向schema_migrations表添加“applied”时间戳

  • 在生成的迁移文件顶部添加# -*- coding: utf-8 -*-

  • 添加README

  • 添加“rollback”命令以回滚迁移

  • 添加“migrate”命令以运行挂起的迁移

  • 在运行init_schema_migrations时向表中添加迁移

  • 添加创建模式迁移表的命令

  • 创建dbmigrator cli和“generate_migration”命令

  • 创建dbmigrator Python包

项目详情


下载文件

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

源分布

db-migrator-1.1.0.tar.gz (34.4 kB 查看哈希值)

上传时间

构建分布

db_migrator-1.1.0-py2.7.egg (50.0 kB 查看哈希值)

上传时间