我有一个应用程序,我想今天为它创建一个新的迁移。我跑的时候
$ alembic revision -m "__name__"
我收到了一条消息
Only a single head is supported. The script directory has multiple heads (due branching), which must be resolved by manually editing the revision files to form a linear sequence.
Run `alembic branches` to see the divergence(s).
正在运行
alembic branches
什么都没有
我是alembic的新手。有2个开发人员正在使用这个应用程序,我们有2个git分支 - master&发展(我不确定这与它有什么关系)。
关于这是什么的任何线索?
答案 0 :(得分:23)
当两个alembic迁移从同一迁移分支时,会发生此问题。通常,当多人进行架构更改时会发生这种情况。要解决此问题,您只需将迁移的down_revision
调整为最新版本。正在运行alembic history
向我们展示了这一点:
2f4682466279 -> f34e92e9dc54 (head), Fifth revision (on a separate branch)
2f4682466279 -> f673ac37b34a (head), Fifth revision (local)
2dc9337c3987 -> 2f4682466279, Fourth revision
0fa2aed0866a -> 2dc9337c3987, Third revision
22af4a75cf06 -> 0fa2aed0866a, Second revision
9a8942e953eb -> 22af4a75cf06, First revision
您可以看到第五个版本之一是在本地进行的,它的下游版本是2f4682466279
,但是制作其他第五个版本的人也获得了相同的下游版本。
进入第五个修订版文件之一并更新down_revision
变量以引用其他第五个修订版,如下所示:
f673ac37b34a -> f34e92e9dc54 (head), Fifth revision (on a separate branch)
2f4682466279 -> f673ac37b34a, Fifth revision (local)
2dc9337c3987 -> 2f4682466279, Fourth revision
0fa2aed0866a -> 2dc9337c3987, Third revision
22af4a75cf06 -> 0fa2aed0866a, Second revision
9a8942e953eb -> 22af4a75cf06, First revision
在这种情况下,我将迁移f34e92e9dc54
更新为down_revision='f673ac37b34a'
。
答案 1 :(得分:15)
也许最常规(最可靠)的解决方案是使用alembic merge heads
。就像在Git中有两个分支一样,您可以将它们与合并提交一起放回去;在Alembic中,当您有两个分支时,可以将它们与合并修订版放回去。
例如,假设我们有一个添加表A的修订版1a6b1a4a0574和一个添加表B的修订版2e49118db057。我们可以在(head)
中看到这些修订版(都标记为alembic history
):>
$ alembic history
<base> -> 2e49118db057 (head), Add table B
<base> -> 1a6b1a4a0574 (head), Add table A
然后我们可以通过运行alembic merge heads
来合并它们:
$ alembic merge heads
Generating /Users/markamery/alembictest/alembic/versions/409782f4c459_.py ... done
$ alembic history
2e49118db057, 1a6b1a4a0574 -> 409782f4c459 (head) (mergepoint), empty message
<base> -> 2e49118db057, Add table B
<base> -> 1a6b1a4a0574, Add table A
如果您的修订之一可能已经在某个地方(包括您一位同事的开发计算机上)运行过,那么您可能想使用alembic merge
而不是修改其中一个的down_revision
修订,如此处的其他答案所示。修补降级修订的危险在于,可能导致修订从未应用。例如,假设您的同事Bob已经删除了版本为2e49118db057的分支并运行alembic upgrade head
,创建了表B。然后,您决定修改2e49118db057的down_revision
以指向Bob拥有的1a6b1a4a0574从来没有见过或跑过。 Bob放弃了您的更改,运行alembic upgrade head
,然后...什么都没有发生,因为就Alembic而言,他已经在head
了,不需要运行1a6b1a4a0574。这样鲍勃最终就永远无法获得表A,也可能永远无法弄清楚为什么他的数据库处于损坏状态。
不要破坏Bob的数据库-而是进行合并修订。
答案 2 :(得分:5)
我已经
了$ python manage.py db history
结果我得到了
vagrant@precise64:/vagrant$ python manage.py db history
Rev: 29c319804087 (head)
Parent: 313837798149
Path: migrations/versions/29c319804087_.py
empty message
Revision ID: 29c319804087
Revises: 313837798149
Create Date: 2014-03-05 21:26:32.538027
Rev: 313837798149
Parent: 280061454d2a
Path: migrations/versions/313837798149_.py
empty message
Revision ID: 313837798149
Revises: 280061454d2a
Create Date: 2014-01-10 03:19:39.838932
Rev: 280061454d2a
Parent: None
Path: migrations/versions/280061454d2a_.py
empty message
Revision ID: 280061454d2a
Revises: None
Create Date: 2013-12-08 03:04:55.885033
Rev: 2e74f61d3b80 (head)
Parent: 49501407aec9
Path: migrations/versions/2e74f61d3b80_o2_lease.py
o2 lease
Revision ID: 2e74f61d3b80
Revises: 49501407aec9
Create Date: 2014-02-28 10:38:06.187420
Rev: 49501407aec9
Parent: None
Path: migrations/versions/49501407aec9_.py
empty message
Revision ID: 49501407aec9
Revises: None
Create Date: 2014-01-22 11:27:08.002187
你在这里看到的是2个不同的分支。一个从49501407aec9开始,第二个从280061454d2a开始。我将49501407aec9和以下2e74f61d3b80移出/ versions目录,运行
$ python manage.py db revision
并创建了一个新的迁移文件。
答案 3 :(得分:1)
使用 merge
命令。
Alembic 合并是将两个或多个“头”文件连接在一起的迁移文件。如果我们现在的两个分支可以说是一个“树”结构,那么引入这个合并文件就会变成一个“菱形”结构:
-- ae1027a6acf -->
/ \
<base> --> 1975ea83b712 --> --> mergepoint
\ /
-- 27c6a30d7c24 -->
因此;
$ alembic merge -m "merge ae1 and 27c" ae1027 27c6a
Generating /path/to/foo/versions/53fffde5ad5_merge_ae1_and_27c.py ... done
如果您更喜欢使用 command
:
>>> from alembic.config import Config
>>> from alembic import command
>>> alembic_cfg = Config("path to alembic.ini")
>>> command.merge(alembic_cfg, revisions=["27c6a30d7c24", "ae1027a6acf"], message="Merge 27c6a30d7c24 and ae1027a6acf")
参考