【发布时间】:2015-05-20 18:25:07
【问题描述】:
有时架构迁移需要很长时间,例如添加/删除/编辑几个字段。如果您在运行模式迁移以更改该表的结构时尝试插入表,会发生什么情况?
我知道,在整个迁移完成之前,这些更改不会持久。
【问题讨论】:
标签: django django-south
有时架构迁移需要很长时间,例如添加/删除/编辑几个字段。如果您在运行模式迁移以更改该表的结构时尝试插入表,会发生什么情况?
我知道,在整个迁移完成之前,这些更改不会持久。
【问题讨论】:
标签: django django-south
这种行为取决于底层数据库和实际迁移正在做什么。例如,PostgreSQL DDL 操作是事务性的;对表的插入将阻塞,直到 DDL 事务完成。例如,在一个psql 窗口中,执行如下操作:
create table kvpair (id serial, key character varying (50), value character varying(100));
begin;
alter table kvpair add column rank integer;
此时,不要提交事务。在另一个psql 窗口中,尝试:
insert into kvpair (key, value) values ('fruit', 'oranges');
你会看到它会阻塞,直到另一个窗口中的事务被提交。
诚然,这是一个人为的例子——锁定的粒度取决于操作(DDL 更改、索引、DML 更新)。此外,任何提交执行的语句都可能假设了不同的约束。例如,将上面的alter table 语句更改为包含not null。在commit 上,插入失败。
根据我的经验,考虑架构更改的“兼容性”并尽量减少会大幅重构大型表的更改总是一件好事。通过执行可能在正在运行的系统上发生的架构更改,仔细注意可以帮助您最大限度地减少停机时间。
【讨论】: