【问题标题】:Possible to migrate bool to int, converting values可以将 bool 迁移到 int,转换值
【发布时间】:2013-09-04 06:54:49
【问题描述】:

我对使用 South 迁移方案和数据的概念有点熟悉,但现在我想完成一些更高级的事情;

我有一个模型,它包含一个指示状态(活动/非活动)的布尔字段,现在我需要使用整数字段添加其他可能性。使用 Souths schememigration,更改本身非常简单。

问题是我需要将现有对象(大约 400+)中的状态转换为整数(0 表示假,1 表示真)。

这甚至可能吗,还是我需要找到其他方法?

【问题讨论】:

  • 在 MySQL 中布尔值存储为 0 和 1。
  • 哇,没有意识到这一点。让这一切变得容易得多。

标签: django django-south data-migration


【解决方案1】:

您使用什么数据库系统?我的 SQL 吗? PostgreSQL ? SQLite ? .. 对我来说,最容易迁移数据的是一个 SQL 补丁。

例如,使用 PostgreSQL:

-- DROP DEFAULT IF THERE IS ONE
ALTER TABLE app_name.model_name ALTER mycolumn TYPE integer USING CASE WHEN mycolumn=FALSE THEN 0 ELSE 1 END;
-- SET A NEW DEFAULT IF THERE WAS ONE

【讨论】:

  • Mysql.想我会用上面 sagarchalise 的评论中的输入来管理。谢谢。
【解决方案2】:

我在使用 PostgreSQL 时遇到了类似的问题,像这样更改迁移有帮助:

def forwards(self, orm):

    # Changing field 'SomeModel.status'
    hlp = db.alter_string_set_type
    db.alter_string_set_type = 'ALTER COLUMN %(column)s TYPE %(type)s USING %(column)s::integer::smallint'
    db.alter_column('someapp_somemodel', 'status', self.gf('django.db.models.fields.PositiveSmallIntegerField')())
    db.alter_string_set_type = hlp

def backwards(self, orm):

    # Changing field 'SomeModel.status'
    hlp = db.alter_string_set_type
    db.alter_string_set_type = 'ALTER COLUMN %(column)s TYPE %(type)s USING %(column)s::integer::boolean'
    db.alter_column('someapp_somemodel', 'status', self.gf('django.db.models.fields.BooleanField')())
    db.alter_string_set_type = hlp

(当然对于 MySQL 的语法会有所不同)

【讨论】:

    【解决方案3】:

    阅读文档后,这非常简单(doh!)。

    架构迁移 - 添加 intfield 数据迁移 - 如果 bool >> int = 1,否则 int = 0 schemamigration - 删除布尔字段

    【讨论】:

      猜你喜欢
      • 2011-07-19
      • 2017-02-24
      • 1970-01-01
      • 1970-01-01
      • 2015-12-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-19
      相关资源
      最近更新 更多