- Go Conference 2019 Spring - https://gocon.jp/
A7 (S): database/sql入門 の資料です。 口頭で話した参考資料等は以下にまとめてあります。
https://budougumi0617.github.io/2019/05/19/gocon2019spring/
database/sql 入門(P$POGFSFODF4QSJOH:PJDIJSP4IJNJ[V!CVEPVHVNJ
View Slide
自己紹介‣ ਗ਼ਫཅҰ!CVEPVHVNJ‣ ‣ #BDLFOE&OHJOFFS‣ (P3VCZ‣ ϒϩάIUUQCVEPVHVNJHJUIVCJP‣ ϘϧμϦϯάࣗ࡞ΩʔϘʔυHPMBOHUPLZP
このセッションの背景‣ (Pͷॻ੶ଟ͘ൃച͞Ε͍ͯΔ͕ʜ‣ σʔλϕʔεૢ࡞͍ͭͯॻ͔Εͨຊ͋·Γͳ͍‣ Πϯλʔωοτ্·ͱ·ͬͨهࣄ͕͋·Γͳ͍‣ YYYϥΠϒϥϦΛ৮ͬͯΈͨܥத্ڃऀ͚ͷνϡʔχϯάهࣄ
今日のゴール‣ %#Λͬͨ։ൃΛߦͳ͏ͨΊͷ४උ͕Ͱ͖Δ‣ EBUBCBTFTRMύοέʔδͷงғؾΛཧղ͢Δ‣ ࣮ͱҰॹʹςετΛॻ͚ΔΑ͏ʹͳΔ‣ %#पΓͷهࣄൃදΛࢀߟʹࣗͰखΛಈ͔ͤΔΑ͏ʹͳΔ
DBを用意する
ローカルにDBサーバを構築する‣ ͍ࣺͯͷσʔλϕʔεΛ༻ҙ͢Δ‣ ྫɿ%PDLFSΛͬͯ.Z42-ΛϙʔτͰىಈ͢Δ
マイグレーションツールを使ったスキーマ定義‣ σʔλϕʔεΛ༻ҙ͚ͨͩ͠ͰσʔλอଘͰ͖ͳ͍‣ ςʔϒϧΛ࡞ͬͯσʔλͷೖΕͷʢεΩʔϚʣΛ༻ҙ͢Δ‣ εΩʔϚͷߏཧΛ͢ΔͨΊʹϚΠάϨʔγϣϯπʔϧΛ͏
Goで書かれたマイグレーションツール‣ IUUQTHJUIVCDPNSVCFOWTRMNJHSBUF‣ IUUQTHJUIVCDPNHPCVGGBMPQPQUSFFNBTUFSTPEB‣ IUUQTHJUIVCDPNHPMBOHNJHSBUFNJHSBUF‣ IUUQTHJUIVCDPNTUFJOCBDIFSHPPTF
sql-migrate‣ γϯϓϧʹϚΠάϨʔγϣϯ༻ͷ42-Λ࣮ߦɾཧͰ͖Δ
sql-migrate‣ %4-Ͱͳ͘ૉͷ42-ΛͬͯϚΠάϨʔγϣϯΛఆٛͰ͖Δ
DB処理の設計方針
Entity(構造体)の定義‣ งғؾ+40/Ϛοϐϯάͱಉ͡‣ /VMMೖͷՄೳੑ͕͋ΔϑΟʔϧυͷܕʹTRM/VMM999Λ‣ (P͔ΒTRM/VMM5JNF͑Δ UJQHPMBOHPSHөࡁΈ
リポジトリパターン‣ σʔλͷ֨ೲॴΛӅณɾநԽ͢Δઃܭύλʔϯ‣ σʔλιʔεͷӬଓԽૢ࡞ΛಛఆQLH ࠓճSFQPTJUPSZQLHʣʹ ΧϓηϧԽ͢Δ͜ͱ͕Ͱ͖Δ‣ ଞͷQLHσʔλιʔεͷӬଓԽૢ࡞ͷৄࡉΛΒͳ͍·· ϏδωεϩδοΫɾΞϓϦέʔγϣϯϩδοΫΛ࣮Ͱ͖Δ
データベース操作の入門
ドライバをロードする‣ ଓઌͷ3%#ʹ͋ͬͨ υϥΠόΛCMBOLJNQPSU‣ .Z42-ͷ߹ɺ HPTRMESJWFSNZTRM͕ σϑΝΫτ
database/sqlを使ったデータベース操作の実装‣ (Pʹ%#ૢ࡞Λ࣮͢Δͱ͖KJO[IVHPSNͳͲͷൺֱతϦονͳϑϨʔϜϫʔΫʢ03.ʣ͕ଘࡏ͢Δ‣ ࠓճ(Pͷ%#ૢ࡞ͷجຊ֓೦Λԡ͑͞ΔͨΊɺ ެࣜͰ͋ΔEBUBCBTFTRMQLHΛྫʹ͢Δ
sql.DB、sql.Conn、sql.Tx オブジェクト‣ TRM%#‣ ෳͷΰϧʔνϯ͔Βར༻͞Εͯ҆શɻαʔϏεىಈ࣌ʹҰTRM0QFO͢Δ͚ͩͰΑ͘ɺ௨ৗ0QFO$MPTFΛ܁Γฦ͞ͳ͍‣ TRM$POO‣ TRM%#$POOϝιου͔ΒऔಘͰ͖ΔɻίωΫγϣϯʹ૬ɻཁ$MPTF‣ TRM5Y‣ τϥϯβΫγϣϯʹ૬ɻίϛοτϩʔϧόοΫૢ࡞Λ͢Δͱ͖ʹɻཁ$MPTF
sql.DB、sql.Conn、sql.Tx オブジェクト‣ 2VFSZ$POUFYU2VFSZ3PX$POUFYU‣ 4&-&$5ૢ࡞‣ &YFD$POUFYU‣ */4&3561%"5&%&-&5&ૢ࡞‣ ͲΕ(P%PDʹ&YBNQMF͕͋ΔͷͰɺͦΕΛΈΔͱΑ͍
Repositoryパターンへの適用
テストを書く
外部環境・サービスに依存しないテストandより実環境の再現を優先したいテスト
再掲
モックを使ったDBに依存しない単体テスト‣ %"5"%0(HPTRMNPDLͱ͍͏બࢶ‣ TRM%#ΦϒδΣΫτͷϞοΫ‣ ظ͢Δ42-จ͕ൃߦ͞Ε͔ͨݕূͰ͖Δ
モックを使ったDBに依存しない単体テスト‣ SBFQPTJUPSZҎ֎ͷQLHϞοΫͰςετͰ͖Δ‣ ࣮ࡍHPMBOHHPNPDLͬͨΓ
DBサーバを使った結合テスト‣ ςετίʔυͷத͔Β%PDLFSΛΘͣ.Z42-αʔόΛىಈ͢Δ‣ IUUQTHJUIVCDPNMFTUSSBUHPUFTUNZTRME‣ ςετίʔυͷத͔Β%PDLFSΛͬͯ.Z42-αʔόΛىಈ͢Δ‣ IUUQTHJUIVCDPNPSZEPDLFSUFTU‣ #VJME$POTUSBJOUTΛ͏ͱςετ͚࣮ͯߦͰ͖Δ‣ HPUFTUͰ࣮ߦ͢ΔϑΝΠϧΛϑΟϧλϦϯά͢Δͷʹ͑Δ
CircleCIの設定例
まとめ‣ ϩʔΧϧͷ.Z42-্ཱ͔ͪ͛Β$*ͷઃఆΛ͢Δͱ͜Ζ·Ͱհ‣ ൃදதͷαϯϓϧίʔυͷશମҎԼͷϦϙδτϦͰ‣ IUUQTHJUIVCDPNCVEPVHVNJHPTRMTBNQMF‣ ޱ಄Ͱհͨ͠هࣄͷ63-ͳͲ໌ϒϩάهࣄͰհ༧ఆ‣ GPMMPXNF!CVEPVHVNJ