$30 off During Our Annual Pro Sale. View Details »

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/

Yoichiro Shimizu

May 18, 2019
Tweet

More Decks by Yoichiro Shimizu

Other Decks in Technology

Transcript

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

    View Slide

  2. 自己紹介
    ‣ ਗ਼ਫཅҰ࿠!CVEPVHVNJ

    ‣ #BDLFOE&OHJOFFS
    ‣ (P3VCZ
    ‣ ϒϩάIUUQCVEPVHVNJHJUIVCJP
    ‣ ϘϧμϦϯάࣗ࡞ΩʔϘʔυHPMBOHUPLZP

    View Slide

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

    View Slide

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

    View Slide

  5. DBを用意する

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  11. DB処理の設計方針

    View Slide

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

    View Slide

  13. リポジトリパターン
    ‣ σʔλͷ֨ೲ৔ॴΛӅณɾந৅Խ͢Δઃܭύλʔϯ
    ‣ σʔλιʔεͷӬଓԽૢ࡞ΛಛఆQLH ࠓճ͸SFQPTJUPSZQLHʣʹ

    ΧϓηϧԽ͢Δ͜ͱ͕Ͱ͖Δ
    ‣ ଞͷQLH͸σʔλιʔεͷӬଓԽૢ࡞ͷৄࡉΛ஌Βͳ͍··

    ϏδωεϩδοΫɾΞϓϦέʔγϣϯϩδοΫΛ࣮૷Ͱ͖Δ

    View Slide

  14. View Slide

  15. View Slide

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

    View Slide

  17. ドライバをロードする
    ‣ ઀ଓઌͷ3%#ʹ͋ͬͨ

    υϥΠόΛCMBOLJNQPSU
    ‣ .Z42-ͷ৔߹͸ɺ

    HPTRMESJWFSNZTRM͕

    σϑΝΫτ

    View Slide

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

    ެࣜͰ͋ΔEBUBCBTFTRMQLHΛྫʹ͢Δ

    View Slide

  19. sql.DB、sql.Conn、sql.Tx オブジェクト
    ‣ TRM%#
    ‣ ෳ਺ͷΰϧʔνϯ͔Βར༻͞Εͯ΋҆શɻαʔϏεىಈ࣌ʹҰ౓TRM0QFO͢Δ
    ͚ͩͰΑ͘ɺ௨ৗ0QFO$MPTFΛ܁Γฦ͞ͳ͍
    ‣ TRM$POO
    ‣ TRM%#
    $POOϝιου͔ΒऔಘͰ͖ΔɻίωΫγϣϯʹ૬౰ɻཁ$MPTF
    ‣ TRM5Y
    ‣ τϥϯβΫγϣϯʹ૬౰ɻίϛοτϩʔϧόοΫૢ࡞Λ͢Δͱ͖ʹɻཁ$MPTF

    View Slide

  20. sql.DB、sql.Conn、sql.Tx オブジェクト
    ‣ 2VFSZ$POUFYU2VFSZ3PX$POUFYU
    ‣ 4&-&$5ૢ࡞
    ‣ &YFD$POUFYU
    ‣ */4&3561%"5&%&-&5&ૢ࡞
    ‣ ͲΕ΋(P%PDʹ&YBNQMF͕͋ΔͷͰɺͦΕΛΈΔͱΑ͍

    View Slide

  21. Repositoryパターンへの適用

    View Slide

  22. テストを書く

    View Slide

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

    View Slide

  24. 再掲

    View Slide

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

    View Slide

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

    View Slide

  27. DBサーバを使った結合テスト
    ‣ ςετίʔυͷத͔Β%PDLFSΛ࢖Θͣ.Z42-αʔόΛىಈ͢Δ
    ‣ IUUQTHJUIVCDPNMFTUSSBUHPUFTUNZTRME
    ‣ ςετίʔυͷத͔Β%PDLFSΛ࢖ͬͯ.Z42-αʔόΛىಈ͢Δ
    ‣ IUUQTHJUIVCDPNPSZEPDLFSUFTU
    ‣ #VJME$POTUSBJOUTΛ࢖͏ͱςετ΋෼͚࣮ͯߦͰ͖Δ
    ‣ HPUFTUͰ΋࣮ߦ͢ΔϑΝΠϧΛϑΟϧλϦϯά͢Δͷʹ࢖͑Δ

    View Slide

  28. CircleCIの設定例

    View Slide

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

    View Slide

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

    View Slide