数据库模式迁移工具,适用于不怕SQL的人

pgmigrate2的Python项目详细描述


理论

pgmigrate帮助您将数据库与应用程序一起发展。

pgmigrate的基本单元是一个名为patch的sql片段。

数据库补丁示例

$ cat 000049_Added_index_on_CategorySlug.sql
--- id:      89ccfca6-6851-11e1-99d8-a088b4e3b168
--- author:  serg
--- memo:    Added index on CategorySlug
--- date:    2012-03-07 14:32

CREATE UNIQUE INDEX catalog_category_slug_shop_id_slug
  ON catalog_category_slug
  USING btree
  (shop_id, slug);

如您所见,patch是一个有效的sql文件,甚至可以直接执行。它还具有良好的、可读的文件名和一些元数据。

快速启动

初始化数据库

$ pgmigrate2 init postgresql://user@password/testdb
$

这将在testdb中创建表\u applied\u patches\uuu。此表用于跟踪已应用的修补程序。

创建补丁repo,并创建第一个补丁

$ mkdir patchrepo
$ pgmigrate2 newpatch patchrepo
... edit patch in your text editor...
Wrote 'patchrepo/000001_creating_table_x.sql'
$

这将创建空补丁并在文本编辑器中打开它。输入patch sql和optional memo,描述此修补程序的功能。

pgmigrate将创建一个类似于patchrepo/000001_creating_table_x.sql的文件,其中000001是补丁序列号,而creating_table_x是 弹片备忘录。pgmigrate将自己填充其余的修补程序元数据。

检查需要应用于

$ pgmigrate2 check patchrepo/ postgresql://user@password/testdb
Need to apply: creating table x
$

check获取补丁repo中的所有补丁,并打印需要应用于testd的补丁列表。

应用修补程序

$ pgmigrate2 migrate patchrepo/ postgresql://user@password/testdb
Need to apply 1 patches:
Applying 'creating table x'
$

migrate从patch repo中获取所有补丁,并依次应用其中的那些补丁,它们的id不在\u applied\u补丁中 测试数据库表。

嵌入

下面是我们如何在项目中使用pgmigrate的示例:

### Database migration commands
@finaloption.command(config_opts)
def dbmigrate(config):
    from shopium.core.config import read_config
    config = read_config(config)
    from pgmigrate2 import api

    return api.migrate('migrations', config.db_uri)


@finaloption.command(config_opts)
def dbnewpatch(config):
    from shopium.core.config import read_config
    config = read_config(config)
    from pgmigrate2 import api

    import subprocess

    path = api.newpatch('migrations')
    if path:
        subprocess.check_call('hg add %s' % path, shell=True) # add created patch to Mercurial repo


@finaloption.command(config_opts)
def dbcheckstatus(config):
    from shopium.core.config import read_config
    config = read_config(config)
    from pgmigrate2 import api

    api.check_status('migrations', config.db_uri)

问答

为什么叫pgmigrate?

这是PostgreSQL迁移的缩写。

真的只是PostgreSQL吗?

实际上没有。我们在内部使用sqlalchemy,这是数据库不可知的,所以理论上它应该可以与任何数据库一起工作。 但由于它是基于原始sql的,所以您需要在任何地方使用相同的dbms。

pgmigrate的设计目标是什么?

  • 为管理项目中的数据库更改提供与框架无关的简单方法
  • 使用原始SQL。我们喜欢原始SQL。
  • 不要到处都有大量的元数据。
  • 不支持降级。
  • 支持基于dvcs的流,其中有许多分支,并且经常在分支之间进行合并。
  • 简单有力

为什么在某些dsl中片段包含sql而不是程序?

我们相信,如果你有一个好的开发人员-这是没有意义的隐瞒 从他们身上获取SQL的能力。因此,使用pgmigrate,您可以完全控制将要执行的操作。 另外,由于我们没有任何花哨的东西,pgmigrate非常简单,几乎可以在任何开发模型中使用。

为什么pgmigrate不支持降级(向下数据库迁移)?

在正常情况下,很少使用降级。由于它们很少被使用,所以没有人测试它们,有时甚至根本不编写它们。 我们相信,不可靠的降级比根本没有降级更糟糕。

所以,如果出了问题,就向前滚动而不是向后滚动。或者,如果真的需要回滚,可以手动创建降级sql。

我希望我的迁移是用python/ruby/shell/whatever编写的?

您可以检查https://github.com/piranha/nomad/它有相似的设计目标,支持可执行补丁,但有点混乱的补丁repo结构。

我可以在Django用吗?

当然。但到目前为止我们还没有management commands,所以,你会 需要你自己写(之后你可以把它们贡献回pgmigrate)。

贡献者

谢尔盖·基里洛夫 米查·帕皮尔斯基

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
在Java中查找一个数的所有因子?   java libGDX绘制纹理区域的一部分   要生成的windows Java编译器选项。exe文件   JFrame中标题栏中的java字幕   java为非java应用程序创建jar文件。类文件   java活动流在应用程序加载时在面板中生成X个数量的对象   java GAE:隐藏敏感网站文件/信息   java使用itext以编程方式单击PDF XFA表单上的按钮   java组件大小问题!由于我不知道的原因,调整到父级大小!   JOptionPane中的java更新消息   Eclipse启动时java启动Tomcat?   java如何使用CameraKit保存照片和视频   java中的XML文档遍历器   java如何在ECDSA中处理基址顺序较长的短哈希   java与MySQL和Netbeans的斗争