我应该如何从 bradjasper 的 django-jsonfield 升级到 Django 的内置 jsonfield?

How should I upgrade from bradjasper's django-jsonfield to Django's built-in jsonfield?

我有一个使用 bradjasper 的 django-jsonfield 包的 Postgres 9.4 / Django 1.8 数据库。 (参见 https://github.com/bradjasper/django-jsonfield ) It works well, but I would like to upgrade the existing data to use Postgres 9.6 and Django 1.9's built-in JSONField. (See https://docs.djangoproject.com/en/1.10/ref/contrib/postgres/fields/#jsonfield )这将允许对 JSON 内容进行更强大的搜索。

如何将旧数据库升级到新数据库?

我尝试过的: 我尝试将一对架构迁移插入

先升级 Postgres。如果所有工作都升级 Django。

只有当一​​切都按预期进行时,您才能开始编写您的现场迁移。

您想从:

from jsonfield import JSONField

class MyModel(models.Model):
  json = JSONField()

收件人:

from django.contrib.postgres.fields import JSONField

class MyModel(models.Model):
  json = JSONField()

步骤:

  1. 添加名为 json_new 的新 Postgres JSON 字段。
  2. 进行迁移。不要迁移。
  3. 深入迁移文件并编写数据迁移 (RunPython) 以填充新的 json 字段。
  4. 进行迁移。
  5. 删除旧字段。删除旧导入。
  6. 进行迁移,迁移。
  7. 将新字段重命名为旧字段名称。 json_new > json.
  8. 进行迁移,迁移。
  9. 完成。

第 1 步:

使用import ... as ...防止碰撞。您的模型将如下所示:

from jsonfield import JSONField as OldJSONField
from django.contrib.postgres.fields import JSONField

class MyModel(models.Model):
  json = OldJSONField()
  json_new = JSONField()

第 3 步:

您需要 RunPython 在迁移中查看 https://docs.djangoproject.com/en/1.10/ref/migration-operations/#runpython 还要注意如何导入模型。

实际的数据迁移是这样的:

for obj in MyModel.objects.all()
    obj.json_new = obj.json  
    obj.save()

第 4 - 7 步:

确保为删除和重命名创建单独的迁移。如果您更改所有代码并创建单个迁移,那么 Django 会认为您删除了 json_new。但是您想删除 json 并将 json_new 重命名为 json。微小但重要的区别。

减少迁移步骤并不难。但这需要手动编写一些代码。我比较懒,喜欢Django帮我写这段代码

@tometzky 通过 的 ALTER COLUMN 命令 这样做几乎没有麻烦:

  • sudo -u postgres psql -c 'ALTER TABLE mytable ALTER COLUMN "myfield" TYPE jsonb USING "myfield"::text::jsonb;' mydatabase

我不需要 Django 的 loaddata / dumpdata 命令或自定义迁移。

我在让 pg_upgrade 以我想要的方式工作时确实遇到了一些问题,因为它不在默认路径上并且想在升级期间更改 Postgres 使用的端口。为了绕过 那个,我做了以下事情:

  • pg_ctl -D /etc/postgresql/9.4/main/stop
  • 在 postgresql.conf 上使用 sed 来更改它使用的端口
  • 安装 Postgres 9.6
  • pg_ctl -D /etc/postgresql/9.6/main/stop
  • cd /var/log/postgresql
  • 运行 pg_upgrade
  • cd 回到原来的工作目录
  • apt-get -y 删除 postgresql-9.4 postgresql-client-9.4 postgresql-server-dev-9.4
  • 服务 postgresql 启动