首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我应该如何从bradjasper的django-jsonfield升级到Django的内置jsonfield?

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

Stack Overflow用户
提问于 2017-01-16 19:06:18
回答 2查看 2.1K关注 0票数 3

我有一个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内容进行更健壮的搜索。

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

我尝试过的是:我尝试将一对模式迁移插入到

  • 将bradjasper JSONField转换为TextField,包括运行迁移。(这不应该改变数据库,因为bradjasper将数据存储为字符串。)
  • 运行Django的dumpdata命令。
  • 更新Postgres & Django版本。
  • 运行迁移,将TextField转换为Django的JSONField。(这应该是数据库中的一个更改,从textjson更改为jsonb)。
  • 运行Django的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 JSONBUpgrade PostgreSQL JSON column to JSONB?,但希望将自定义的SQL最小化。
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-01-17 22:36:10

来自@tometzky通过Upgrade PostgreSQL JSON column to JSONB?的ALTER命令以令人惊讶的小麻烦完成了这一任务:

  • sudo -u postgres psql -c‘列"myfield“类型为jsonb,使用"myfield"::text::jsonb;’mydatabase

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

我确实遇到了一些问题,让pg_upgrade按照我想要的方式工作,因为它不是在默认路径上,而是希望在升级期间更改Postgres使用的端口。为了避免这种情况,我做了以下几件事:

  • pg_ctl -D /etc/postgresql/9.4/main/ stop
  • 使用sed on postgresql.conf更改它使用的端口
  • 安装Postgres 9.6
  • pg_ctl -D /etc/postgresql/9.6/main/ stop
  • cd /var/log/postgresql
  • 运行pg_upgrade
  • 光盘返回到原始工作目录
  • apt-获取-y删除PostgreSQL9.4 postgresql 9.4 postgresql-server-dev-9.4
  • 服务postgresql启动
票数 4
EN

Stack Overflow用户

发布于 2017-01-16 20:16:53

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

只有当一切按预期工作时,您才能开始编写您的字段迁移。

你想从:

代码语言:javascript
复制
from jsonfield import JSONField

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

至:

代码语言:javascript
复制
from django.contrib.postgres.fields import JSONField

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

步骤:

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

步骤1:

使用import ... as ...来防止碰撞。您的模型看起来如下:

代码语言:javascript
复制
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还注意如何导入您的模型。

实际的数据迁移将类似于:

代码语言:javascript
复制
for obj in MyModel.objects.all()
    obj.json_new = obj.json  
    obj.save()

步骤4- 7:

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

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

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41683385

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档