数据库模式迁移工具,适用于不怕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)。
贡献者
谢尔盖·基里洛夫 米查·帕皮尔斯基