我有一个Postgres 9.4 / Django 1.8数据库,它使用bradjasper的django-jsonfield包。(参见https://github.com/bradjasper/django-jsonfield )它工作得很好,但是我想升级现有的数据,以使用Postgres9.6和Django 1.9的内置JSONField。(请参阅https://docs.djangoproject.com/en/1.10/ref/contrib/postgres/fields/#jsonfield )这将允许对JSON内容进行更健壮的搜索。
如何将旧数据库升级到新数据库?
我尝试过的是:我尝试将一对模式迁移插入到
dumpdata命令。text或json更改为jsonb)。loaddata命令。这就产生了一个错误,比如:u"[] (type <type 'unicode'>) is not a valid list for field url_methods"]: (myapp.mytable:pk=1) field_value was '[]',我正在查看postgresql migrating JSON to JSONB和Upgrade PostgreSQL JSON column to JSONB?,但希望将自定义的SQL最小化。发布于 2017-01-17 22:36:10
来自@tometzky通过Upgrade PostgreSQL JSON column to JSONB?的ALTER命令以令人惊讶的小麻烦完成了这一任务:
我不需要Django的loaddata / dumpdata命令或自定义迁移。
我确实遇到了一些问题,让pg_upgrade按照我想要的方式工作,因为它不是在默认路径上,而是希望在升级期间更改Postgres使用的端口。为了避免这种情况,我做了以下几件事:
sed on postgresql.conf更改它使用的端口发布于 2017-01-16 20:16:53
先升级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()步骤:
json_new的新Postgres字段。json_new > json。步骤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为我编写这段代码。
https://stackoverflow.com/questions/41683385
复制相似问题