如何从bradjasper升级';s django jsonfield至django';s内置的jsonfield?
我有一个Postgres9.4/Django1.8数据库,它使用bradjasper的如何从bradjasper升级';s django jsonfield至django';s内置的jsonfield?,json,django,postgresql,jsonb,Json,Django,Postgresql,Jsonb,我有一个Postgres9.4/Django1.8数据库,它使用bradjasper的DjangoJSonfield包。(请参阅)它工作得很好,但我想升级现有数据以使用Postgres 9.6和Django 1.9的内置JSONField。(请参阅)这将允许对JSON内容进行更健壮的搜索 如何将旧数据库升级到新数据库 我所尝试的: 我尝试将一对模式迁移插入到 将bradjasper JSONField转换为文本字段,包括运行迁移。(这不应改变数据库,因为bradjasper将数据存储为字符串。
DjangoJSonfield
包。(请参阅)它工作得很好,但我想升级现有数据以使用Postgres 9.6和Django 1.9的内置JSONField。(请参阅)这将允许对JSON内容进行更健壮的搜索
如何将旧数据库升级到新数据库
我所尝试的:
我尝试将一对模式迁移插入到
- 将bradjasper JSONField转换为文本字段,包括运行迁移。(这不应改变数据库,因为bradjasper将数据存储为字符串。)
- 运行Django的
命令dumpdata
- 更新了Postgres和Django版本
- 运行迁移以将TextField转换为Django的JSONField。(这应该是数据库中的更改,从
或text
更改为json
)jsonb
- 运行Django的
命令。这会出现如下错误:loaddata
我正在查看,但希望尽量减少自定义SQLu“[](类型)不是字段url\u方法的有效列表]:(myapp.mytable:pk=1)字段\u值为“[]”
from jsonfield import JSONField
class MyModel(models.Model):
json = JSONField()
致:
步骤:
JSON\u new
的新Postgres JSON字段json\u new
json
导入。。。作为…
以防止碰撞。您的模型将如下所示:
from jsonfield import JSONField as OldJSONField
from django.contrib.postgres.fields import JSONField
class MyModel(models.Model):
json = OldJSONField()
json_new = JSONField()
步骤3:
您需要在迁移中运行Python
,请参见
还要注意如何导入模型
实际的数据迁移类似于:
for obj in MyModel.objects.all()
obj.json_new = obj.json
obj.save()
步骤4-7:
确保为删除和重命名创建单独的迁移。如果您进行所有代码更改并创建一个迁移,Django会认为您删除了json\u new
。但是您想要删除json
并将json\u new
重命名为json
。微小但重要的区别
减少迁移步骤并不难。但这需要手工编写一些代码。我很懒,喜欢Django为我写这段代码。来自@tometzky via的ALTER COLUMN命令 这样做的麻烦小得出奇:
- sudo-u postgres psql-c'ALTER TABLE mytable ALTER COLUMN“myfield”使用“myfield”键入jsonb::text::jsonb;'我的数据库
- 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
- 运行pgu升级
- cd返回到原始工作目录
- apt get-y删除postgresql-9.4 postgresql-client-9.4 postgresql-server-dev-9.4
- postgresql启动服务
F
表达式MyModel.objects.update(json\u new=F('json'))在RunPython
中执行数据迁移,只需一次查询即可F
将起作用,速度更快,数据库上的负载更少。
for obj in MyModel.objects.all()
obj.json_new = obj.json
obj.save()