2017-07-28 117 views
0

大家好,我正在寻找方法来更改字段类型并在此期间转换其值。
我的意思是类似的东西:如何通过算法修改ecto中的字段

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

我知道Ecto.Migration#modify/3功能得到&fragment/1说法。但它只有一个参数。
有谁知道是否可以通过当前值&fragment/1函数?
或者,也许有人知道更好的方式来做到这一点?

回答

0

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

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

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 TABLEhere阅读更多关于USING

+0

谢谢你,Dogbert。有用! – CarefreeSlacker