Django将数据库字段从整数更改为CharField

mps*_*psg 6 python django postgresql

我有一个Django应用程序与一个填充(Postgres)数据库,有一个整数字段,我需要更改为CharField.我需要在此字段中开始以前导零存储数据.如果我运行migrate(Django 1.8.4),我会收到以下错误:

psycopg2.ProgrammingError: operator does not exist: character varying >= integer

HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts.
Run Code Online (Sandbox Code Playgroud)

我试着搜索谷歌,但没有找到太多帮助.我真的不知道我应该在这做什么.有人可以帮忙吗?

mps*_*psg 7

最初,我认为会有一个简单的解决方案,其中 Django 或 Postgres 会自动进行转换,但似乎并不能那样工作。我认为其他人提出的一些建议可能有效,但我自己提出了一个简单的解决方案。这是在生产数据库上完成的,所以我必须小心。我最终将字符字段添加到模型中并进行了迁移。然后,我在 python shell 中运行一个小脚本,复制整数字段中的数据,进行所需的转换,然后将其写入生产数据库中同一记录中的新字段。

例如:

members = Members.objects.all()
for mem in members:
    mem.memNumStr = str(mem.memNum)
    ... more data processing here
    mem.save()
Run Code Online (Sandbox Code Playgroud)

现在,我将数据复制到表中的 str 字段和 int 字段中。然后,我可以修改访问该字段的视图并在生产数据库上测试它,而不会破坏旧代码。一旦完成,我就可以删除旧的 int 字段。有点复杂,但最终非常简单。


chu*_*ash 6

您需要生成架构迁移。您如何做到这一点取决于您使用的 Django 版本(1.7 和更新版本具有内置迁移;旧版本的 Django 将使用south)。

注意:如果此数据是生产数据,则您需要非常小心地处理。确保您有一个已知良好的数据副本,如果事情变得棘手,您可以重新安装。在非生产环境中测试您的迁移。是。小心!

至于字段上的转换(从 IntegerField 到 CharField)和字段值上的转换(以前导零开头) - Django 无法为您执行此操作,您必须手动编写。执行此操作的正确方法是使用django.db.migrations.RunPython迁移命令(请参阅此处)。

我的建议是生成多个迁移;创建一个新的 IntegerField,my_new_column然后通过 RunPython 写入这个新列。然后,运行第二次迁移,删除原始 CharFieldmy_old_column并将其重命名my_new_columnmy_old_column.