我们正在重写一个使用 MySQL 数据库的大型 Django 应用程序,数据库架构需要进行重大修改。我们还移植应用程序以使用 PostgreSQL,有几个很好的理由。
我写了一个小脚本,允许我将旧的 MySQL 表转储到 PostgreSQL 数据库中,在它们的名字前加上 oldapp_*
我们开始编写一些数据迁移脚本,它们基本上是:
insert into foobar(c1, c2, ..., cn)
select c1, c2, ..., cn from oldapp_foobar where ...
现在,此应用广泛使用代理键(Django 不允许复合主键并鼓励大量使用代理键)。对于第一个迁移脚本,我暂时跳过了插入/选择中的代理键,因此 PostgreSQL 会自动生成新的 ID。
这当然有效,但是在迁移外键时这不是一个好主意。我正在考虑几种方法,但我希望能在这里提供一些意见。
只保留钥匙。例如,您将能够更轻松地在旧数据库中定位数据。
但是请记住在迁移后更新与您的键关联的序列,以便它们的值大于数据库中最大的键。
我会像您已经做的那样生成新的代理键。删除键空间中的间隙。
但是我会将每个表的旧代理键保存在一个额外的行中,这样您就可以可靠地连接到旧数据。当迁移完成并且您最终永远放弃
oldapp_*
表时,您可以删除额外的列。