Phoenix Ecto 插入原始數據

假設有如下數據 Records

rank  name  desc
1  apple  fruit
2  cat  animal
3  bike  vehicle

如果你想把你的集合拆分成小的分組,chunk就是你要找的函數:

iex> Enum.chunk([1, 2, 3, 4, 5, 6], 2)
[[1, 2], [3, 4], [5, 6]]

使用~w()這個魔術符可以將空格分割的字符串轉換為列表:

iex> ~w(1  apple  fruit)
["1", "apple", "fruit"]

1. 數據預處理:輸入所有數據到data列表變量

iex> data = ~w(1  apple  fruit
...> 2  cat  animal
...> 3  bike  vehicle)
["1", "apple", "fruit", "2", "cat", "animal", "3", "bike", "vehicle"]

2. 數據分組:使用chunk函數進行分組

iex> Enum.chunk(data, 3)
[["1", "apple", "fruit"], ["2", "cat", "animal"], ["3", "bike", "vehicle"]]

當然,也可以寫成

data |> Enum.chunk(3)

結果是一樣的

3. 構成結構體

可以使用Enum.zip組合兩個列表

iex> Enum.zip([:rank, :name, :desc], ["1", "apple", "fruit"])
[rank: "1", name: "apple", desc: "fruit"]

如果在后面使用Enum.into就可以構造map類型啦!

iex> Enum.zip([:rank, :name, :desc], ["1", "apple", "fruit"]) |> Enum.into(%{})
%{desc: "fruit", name: "apple", rank: "1"}

4. Map VS Struct

這里我們回顧一下Elixir Map和Struct的區別,map屬于基本結構,形式為%{usernmae: "szy", passwd: "elixir"},注意到這里的username拼寫錯誤,在使用時:

iex> user.username
** (KeyError) key :username not found in: %{passwd: "elixir", usernmae: "szy"}

發現提示沒有找到這個key。這說明map只在runtime進行key的驗證,在插入的時候沒有進行驗證。如果希望在插入數據時就對key是否存在進行驗證,則需要使用struct。

Struct本質上也是一個Map,只不過多了一個Key,也就是__struct__

iex> user = %User{username: "szy"}
%Elecity.User{__meta__: #Ecto.Schema.Metadata<:built>, description: nil,
 email: nil, id: nil, inserted_at: nil, password: nil, password_hash: nil,
 updated_at: nil,
 user_role_id: nil, username: "szy"}

如果插入時沒有key會立即提示錯誤

iex> user2 = %User{usernmae: "szy"}
** (CompileError) iex:3: unknown key :usernmae for struct Elecity.User

此外,插入時沒有聲明的部分會自動填充默認內容。

5. 綜合

現在我們就來構造結構體吧!同樣使用~w()a,這里后面的a代表轉換的是atom類型。

iex> key = ~w(rank  name  desc)a
[:rank, :name, :desc]
iex> data = ~w(1  apple  fruit
...> 2  cat  animal
...> 3  bike  vehicle)
["1", "apple", "fruit", "2", "cat", "animal", "3", "bike", "vehicle"]
iex> data = Enum.chunk(data, 3)
[["1", "apple", "fruit"], ["2", "cat", "animal"], ["3", "bike", "vehicle"]]
iex(19)> for record <- data do
...(19)>   Enum.zip(key, record)
...(19)>   |> Enum.into(%Record{})
...(19)>   |> Repo.insert!()
...(19)> end

當然,使用insert_all可以大大簡化

MyApp.Repo.insert_all(Post, [[title: "hello", body: "world"], [title: "another", body: "post"]])

第一個data

iex(21)> for rec <- data do
...(21)> Enum.zip(key, rec)
...(21)> end
[[rank: "1", name: "apple", desc: "fruit"],
 [rank: "2", name: "cat", desc: "animal"],
 [rank: "3", name: "bike", desc: "vehicle"]]

總結一下,就是:

  1. ~w()a轉換key
  2. ~w()轉換數據
  3. Enum.chunk分組數據
  4. Enum.zip添加key
  5. Enum.into轉換Struct后逐個插入Ecto 1.x
  6. 批量 insert_all (Step4) Ecto 2.x

http://blog.plataformatec.com.br/2016/05/ectos-insert_all-and-schemaless-queries/
http://www.elixir-cn.com/posts/136

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,619評論 6 539
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,155評論 3 425
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,635評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,539評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,255評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,646評論 1 326
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,655評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,838評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,399評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,146評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,338評論 1 372
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,893評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,565評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,983評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,257評論 1 292
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,059評論 3 397
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,296評論 2 376

推薦閱讀更多精彩內容