2017-07-28 115 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