【问题标题】:How to modify field in ecto by Algorithm如何通过算法修改 ecto 中的字段
【发布时间】:2017-07-28 14:55:19
【问题描述】:

大家好,我正在寻找在此期间更改字段类型并转换其值的方法。
我的意思是这样的:

def up do
  alter table(:users) do
    modify :role, :integer, default: fragment("convertion_function")
  end
end

我知道Ecto.Migration#modify/3 函数获取 &fragment/1 参数。但它只有一个论点。
有谁知道是否可以将当前值传递给 &fragment/1 函数?
或者也许有人知道更好的方法吗?

【问题讨论】:

    标签: database postgresql elixir ecto


    【解决方案1】:

    在 PostgreSQL 中,这可以通过为 ALTER TABLE <table> ALTER COLUMN <column> 查询指定 USING 子句来完成。在 Ecto 的迁移中,我找不到任何对此的支持。您可以使用execute 执行原始查询来执行此操作。以下是如何将 posts 表的 title 列从字符串更改为整数并将新值设置为原始标题的长度:

    def up do
      execute """
        alter table posts
          alter column title
            type integer
            using length(title);
      """
    end
    

    length(title)是计算新值的片段表达式。

    您还需要为反向迁移编写类似的查询。

    您可以在ALTER TABLE here 中阅读有关USING 的更多信息。

    【讨论】:

      【解决方案2】:

      default会为新行设置默认值,与现有数据的转换无关。

      AFAIK,没有办法在不丢失 PostgreSQL/MySQL 中的数据的情况下修改列类型。唯一的方法是使用迁移 #1 创建一个新列,使用迁移 #2 迁移现有数据并删除旧列 + 使用迁移 #3 将新列重命名为旧名称。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-18
        • 1970-01-01
        • 1970-01-01
        • 2018-05-09
        • 2016-05-10
        相关资源
        最近更新 更多