database/sql入門 / introduction database sql

database/sql入門 / introduction database sql

- Go Conference 2019 Spring
- https://gocon.jp/

A7 (S): database/sql入門 の資料です。
口頭で話した参考資料等は以下にまとめてあります。

https://budougumi0617.github.io/2019/05/19/gocon2019spring/

Eb6be531bcfaa99714d8d3b48665a5a9?s=128

Yoichiro Shimizu

May 18, 2019
Tweet

Transcript

  1. database/sql 入門 (P$POGFSFODF4QSJOH :PJDIJSP4IJNJ[V!CVEPVHVNJ

  2. 自己紹介 ‣ ਗ਼ਫཅҰ࿠!CVEPVHVNJ ‣  ‣ #BDLFOE&OHJOFFS ‣ (P3VCZ ‣

    ϒϩάIUUQCVEPVHVNJHJUIVCJP ‣ ϘϧμϦϯάࣗ࡞ΩʔϘʔυHPMBOHUPLZP
  3. このセッションの背景 ‣ (Pͷॻ੶͸਺ଟ͘ൃച͞Ε͍ͯΔ͕ʜ ‣ σʔλϕʔεૢ࡞͍ͭͯॻ͔Εͨຊ͸͋·Γͳ͍ ‣ Πϯλʔωοτ্΋·ͱ·ͬͨهࣄ͕͋·Γͳ͍ ‣ YYYϥΠϒϥϦΛ৮ͬͯΈͨܥ΍த্ڃऀ޲͚ͷνϡʔχϯάه ࣄ

  4. 今日のゴール ‣ %#Λ࢖ͬͨ։ൃΛߦͳ͏ͨΊͷ४උ͕Ͱ͖Δ ‣ EBUBCBTFTRMύοέʔδͷงғؾΛཧղ͢Δ ‣ ࣮૷ͱҰॹʹςετΛॻ͚ΔΑ͏ʹͳΔ ‣ %#पΓͷهࣄ΍ൃදΛࢀߟʹࣗ෼ͰखΛಈ͔ͤΔΑ͏ʹͳΔ

  5. DBを用意する

  6. ローカルにDBサーバを構築する ‣ ࢖͍ࣺͯͷσʔλϕʔεΛ༻ҙ͢Δ ‣ ྫɿ%PDLFSΛ࢖ͬͯ.Z42-ΛϙʔτͰىಈ͢Δ

  7. マイグレーションツールを使ったスキーマ定義 ‣ σʔλϕʔεΛ༻ҙ͚ͨͩ͠Ͱ͸σʔλ͸อଘͰ͖ͳ͍ ‣ ςʔϒϧΛ࡞ͬͯσʔλͷೖΕ΋ͷʢεΩʔϚʣΛ༻ҙ͢Δ ‣ εΩʔϚͷߏ੒؅ཧΛ͢ΔͨΊʹ͸ϚΠάϨʔγϣϯπʔϧΛ࢖͏

  8. Goで書かれたマイグレーションツール ‣ IUUQTHJUIVCDPNSVCFOWTRMNJHSBUF ‣ IUUQTHJUIVCDPNHPCVGGBMPQPQUSFFNBTUFSTPEB ‣ IUUQTHJUIVCDPNHPMBOHNJHSBUFNJHSBUF ‣ IUUQTHJUIVCDPNTUFJOCBDIFSHPPTF

  9. sql-migrate ‣ γϯϓϧʹϚΠάϨʔγϣϯ༻ͷ42-Λ࣮ߦɾ؅ཧͰ͖Δ

  10. sql-migrate ‣ %4-Ͱ͸ͳ͘ૉͷ42-Λ࢖ͬͯϚΠάϨʔγϣϯΛఆٛͰ͖Δ

  11. DB処理の設計方針

  12. Entity(構造体)の定義 ‣ งғؾ͸+40/Ϛοϐϯάͱಉ͡ ‣ /VMM୅ೖͷՄೳੑ͕͋ΔϑΟʔϧυͷܕʹ͸TRM/VMM999Λ ‣ (P͔Β͸TRM/VMM5JNF΋࢖͑Δ UJQHPMBOHPSH൓өࡁΈ

  13. リポジトリパターン ‣ σʔλͷ֨ೲ৔ॴΛӅณɾந৅Խ͢Δઃܭύλʔϯ ‣ σʔλιʔεͷӬଓԽૢ࡞ΛಛఆQLH ࠓճ͸SFQPTJUPSZQLHʣʹ
 ΧϓηϧԽ͢Δ͜ͱ͕Ͱ͖Δ ‣ ଞͷQLH͸σʔλιʔεͷӬଓԽૢ࡞ͷৄࡉΛ஌Βͳ͍··
 ϏδωεϩδοΫɾΞϓϦέʔγϣϯϩδοΫΛ࣮૷Ͱ͖Δ

  14. None
  15. None
  16. データベース操作の入門

  17. ドライバをロードする ‣ ઀ଓઌͷ3%#ʹ͋ͬͨ
 υϥΠόΛCMBOLJNQPSU ‣ .Z42-ͷ৔߹͸ɺ
 HPTRMESJWFSNZTRM͕
 σϑΝΫτ

  18. database/sqlを使ったデータベース操作の実装 ‣ (Pʹ΋%#ૢ࡞Λ࣮૷͢Δͱ͖͸KJO[IVHPSNͳͲͷൺֱతϦονͳ ϑϨʔϜϫʔΫʢ03.ʣ͕ଘࡏ͢Δ ‣ ࠓճ͸(Pͷ%#ૢ࡞ͷجຊ֓೦Λԡ͑͞ΔͨΊɺ
 ެࣜͰ͋ΔEBUBCBTFTRMQLHΛྫʹ͢Δ

  19. sql.DB、sql.Conn、sql.Tx オブジェクト ‣ TRM%# ‣ ෳ਺ͷΰϧʔνϯ͔Βར༻͞Εͯ΋҆શɻαʔϏεىಈ࣌ʹҰ౓TRM0QFO͢Δ ͚ͩͰΑ͘ɺ௨ৗ0QFO$MPTFΛ܁Γฦ͞ͳ͍ ‣ TRM$POO ‣

    TRM%# $POOϝιου͔ΒऔಘͰ͖ΔɻίωΫγϣϯʹ૬౰ɻཁ$MPTF ‣ TRM5Y ‣ τϥϯβΫγϣϯʹ૬౰ɻίϛοτϩʔϧόοΫૢ࡞Λ͢Δͱ͖ʹɻཁ$MPTF
  20. sql.DB、sql.Conn、sql.Tx オブジェクト ‣ 2VFSZ$POUFYU2VFSZ3PX$POUFYU ‣ 4&-&$5ૢ࡞ ‣ &YFD$POUFYU ‣ */4&3561%"5&%&-&5&ૢ࡞

    ‣ ͲΕ΋(P%PDʹ&YBNQMF͕͋ΔͷͰɺͦΕΛΈΔͱΑ͍
  21. Repositoryパターンへの適用

  22. テストを書く

  23. 外部環境・サービスに依存しないテスト and より実環境の再現を優先したいテスト

  24. 再掲

  25. モックを使ったDBに依存しない単体テスト ‣ %"5"%0(HPTRMNPDLͱ͍͏ બ୒ࢶ ‣ TRM%#ΦϒδΣΫτͷϞοΫ ‣ ظ଴͢Δ42-จ͕ൃߦ͞Ε͔ͨ ݕূͰ͖Δ

  26. モックを使ったDBに依存しない単体テスト ‣ SBFQPTJUPSZҎ֎ͷQLH͸ϞοΫ ͰςετͰ͖Δ ‣ ࣮ࡍHPMBOHHPNPDL࢖ͬͨΓ

  27. DBサーバを使った結合テスト ‣ ςετίʔυͷத͔Β%PDLFSΛ࢖Θͣ.Z42-αʔόΛىಈ͢Δ ‣ IUUQTHJUIVCDPNMFTUSSBUHPUFTUNZTRME ‣ ςετίʔυͷத͔Β%PDLFSΛ࢖ͬͯ.Z42-αʔόΛىಈ͢Δ ‣ IUUQTHJUIVCDPNPSZEPDLFSUFTU ‣

    #VJME$POTUSBJOUTΛ࢖͏ͱςετ΋෼͚࣮ͯߦͰ͖Δ ‣ HPUFTUͰ΋࣮ߦ͢ΔϑΝΠϧΛϑΟϧλϦϯά͢Δͷʹ࢖͑Δ
  28. CircleCIの設定例

  29. 今日のゴール ‣ %#Λ࢖ͬͨ։ൃΛߦͳ͏ͨΊͷ४උ͕Ͱ͖Δ ‣ EBUBCBTFTRMύοέʔδͷงғؾΛཧղ͢Δ ‣ ࣮૷ͱҰॹʹςετΛॻ͚ΔΑ͏ʹͳΔ ‣ %#पΓͷهࣄ΍ൃදΛࢀߟʹࣗ෼ͰखΛಈ͔ͤΔΑ͏ʹͳΔ

  30. まとめ ‣ ϩʔΧϧͷ.Z42-্ཱ͔ͪ͛Β$*ͷઃఆΛ͢Δͱ͜Ζ·Ͱ঺հ ‣ ൃදதͷαϯϓϧίʔυͷશମ͸ҎԼͷϦϙδτϦͰ ‣ IUUQTHJUIVCDPNCVEPVHVNJHPTRMTBNQMF ‣ ޱ಄Ͱ঺հͨ͠هࣄͷ63-ͳͲ͸໌೔ϒϩάهࣄͰ঺հ༧ఆ ‣

    GPMMPXNF!CVEPVHVNJ