Phoenix Ecto 插入原始數(shù)據(jù)

假設(shè)有如下數(shù)據(jù) Records

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

如果你想把你的集合拆分成小的分組捶闸,chunk就是你要找的函數(shù):

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

使用~w()這個(gè)魔術(shù)符可以將空格分割的字符串轉(zhuǎn)換為列表:

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

1. 數(shù)據(jù)預(yù)處理:輸入所有數(shù)據(jù)到data列表變量

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

2. 數(shù)據(jù)分組:使用chunk函數(shù)進(jìn)行分組

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

當(dāng)然兄纺,也可以寫成

data |> Enum.chunk(3)

結(jié)果是一樣的

3. 構(gòu)成結(jié)構(gòu)體

可以使用Enum.zip組合兩個(gè)列表

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

如果在后面使用Enum.into就可以構(gòu)造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的區(qū)別,map屬于基本結(jié)構(gòu)颓遏,形式為%{usernmae: "szy", passwd: "elixir"}狸剃,注意到這里的username拼寫錯(cuò)誤,在使用時(shí):

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

發(fā)現(xiàn)提示沒有找到這個(gè)key烹玉。這說明map只在runtime進(jìn)行key的驗(yàn)證驰怎,在插入的時(shí)候沒有進(jìn)行驗(yàn)證。如果希望在插入數(shù)據(jù)時(shí)就對key是否存在進(jìn)行驗(yàn)證二打,則需要使用struct县忌。

Struct本質(zhì)上也是一個(gè)Map,只不過多了一個(gè)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"}

如果插入時(shí)沒有key會立即提示錯(cuò)誤

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

此外,插入時(shí)沒有聲明的部分會自動填充默認(rèn)內(nèi)容瑞信。

5. 綜合

現(xiàn)在我們就來構(gòu)造結(jié)構(gòu)體吧厉颤!同樣使用~w()a,這里后面的a代表轉(zhuǎn)換的是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

當(dāng)然逼友,使用insert_all可以大大簡化

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

第一個(gè)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"]]

總結(jié)一下绩郎,就是:

  1. ~w()a轉(zhuǎn)換key
  2. ~w()轉(zhuǎn)換數(shù)據(jù)
  3. Enum.chunk分組數(shù)據(jù)
  4. Enum.zip添加key
  5. Enum.into轉(zhuǎn)換Struct后逐個(gè)插入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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市翁逞,隨后出現(xiàn)的幾起案子肋杖,更是在濱河造成了極大的恐慌,老刑警劉巖挖函,帶你破解...
    沈念sama閱讀 211,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件状植,死亡現(xiàn)場離奇詭異,居然都是意外死亡怨喘,警方通過查閱死者的電腦和手機(jī)津畸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,347評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來必怜,“玉大人肉拓,你說我怎么就攤上這事∈崆欤” “怎么了暖途?”我有些...
    開封第一講書人閱讀 157,435評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長膏执。 經(jīng)常有香客問我驻售,道長,這世上最難降的妖魔是什么更米? 我笑而不...
    開封第一講書人閱讀 56,509評論 1 284
  • 正文 為了忘掉前任欺栗,我火速辦了婚禮,結(jié)果婚禮上征峦,老公的妹妹穿的比我還像新娘迟几。我一直安慰自己,他們只是感情好栏笆,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,611評論 6 386
  • 文/花漫 我一把揭開白布类腮。 她就那樣靜靜地躺著,像睡著了一般竖伯。 火紅的嫁衣襯著肌膚如雪存哲。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,837評論 1 290
  • 那天七婴,我揣著相機(jī)與錄音祟偷,去河邊找鬼。 笑死打厘,一個(gè)胖子當(dāng)著我的面吹牛修肠,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播户盯,決...
    沈念sama閱讀 38,987評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼嵌施,長吁一口氣:“原來是場噩夢啊……” “哼饲化!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起吗伤,我...
    開封第一講書人閱讀 37,730評論 0 267
  • 序言:老撾萬榮一對情侶失蹤吃靠,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后足淆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體巢块,經(jīng)...
    沈念sama閱讀 44,194評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,525評論 2 327
  • 正文 我和宋清朗相戀三年巧号,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了族奢。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,664評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡丹鸿,死狀恐怖越走,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情靠欢,我是刑警寧澤廊敌,帶...
    沈念sama閱讀 34,334評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站掺涛,受9級特大地震影響庭敦,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜薪缆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,944評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望伞广。 院中可真熱鬧拣帽,春花似錦、人聲如沸嚼锄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,764評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽区丑。三九已至拧粪,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間沧侥,已是汗流浹背可霎。 一陣腳步聲響...
    開封第一講書人閱讀 31,997評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留宴杀,地道東北人癣朗。 一個(gè)月前我還...
    沈念sama閱讀 46,389評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像旺罢,于是被迫代替她去往敵國和親旷余。 傳聞我的和親對象是個(gè)殘疾皇子绢记,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,554評論 2 349

推薦閱讀更多精彩內(nèi)容