【问题标题】:Django 1.3 - BooleanField to DateTimeField Migration FailsDjango 1.3 - 从 BooleanField 到 DateTimeField 的迁移失败
【发布时间】:2013-07-20 13:14:27
【问题描述】:

在 Postgres 9.1 上使用 Django 1.3。

我的任务是将两个旧的布尔字段 pulledmail_report 迁移到时间戳。

在尝试迁移时,我收到以下错误,我不确定如何绕过手动删除数据库中的非 Null 约束以允许我将所有记录转换为 null。 django.db.utils.DatabaseError: column "pulled" cannot be cast to type timestamp with time zone

任何不涉及我手动修改我们的实时数据库的见解将不胜感激。

模型声明更改:

     # Reporting Checked Flags
     # pulled => Object has been processed through order_picklist
-    pulled = models.BooleanField(default=False)
+    pulled = models.DateTimeField(blank=True, null=True, default=None)
     # mail_report => Object has been processed through report_mailing_list
-    mail_report = models.BooleanField(default=False)
+    mail_report = models.DateTimeField(blank=True, null=True, default=None)

【问题讨论】:

  • 我认为最好在两个单独的迁移中执行此操作:首先,从模型中删除两列,其次,使用新类型重新创建它们。
  • @PauloBu 我想我唯一的麻烦是我需要保存现有布尔值的状态,所以我可以为所有当前标记为 true 的对象添加一个 datetime.now() 标记。跨度>

标签: django postgresql migration django-south


【解决方案1】:

您应该阅读the Data Migration section in the South's docs。在那里,他们教你如何将纯文本密码更改为散列密码。为此,他们需要保留当前密码的值并进行转换。

我的建议是一步一步地进行迁移,如下所示:

  1. 使用名称创建新的datetimes 列:pulled2mail_report2
  2. 创建数据迁移以填充这些列,具体取决于它们各自列 pulledmail_report 中的布尔值
  3. 创建另一个迁移以删除布尔列 pulledmail_report
  4. 创建最后一个迁移以将 pulled2mail_report2 重命名为 pulledmail_report

希望此大纲和文档中的the tutorials 对您有所帮助!

【讨论】:

  • 这会很好,我在概念上使用它来获得我需要的东西。不幸的是,我们必须预先装配这些事务,以使我们的实时服务器尽可能少地停机,这意味着我不能花时间迁移、更改源、迁移。所以我使用了一个原始查询来避免 Django 的查询参数验证来获取一个 id 列表,删除旧的,创建一个新的,并遍历 id 的列表来初始化它们。感谢您让我朝着正确的方向思考。
  • 好吧,我很高兴你能成功:)
猜你喜欢
  • 2021-01-09
  • 2018-05-18
  • 1970-01-01
  • 1970-01-01
  • 2020-05-29
  • 2017-03-10
  • 2018-01-04
  • 2011-09-28
相关资源
最近更新 更多