Slide 1

Slide 1 text

GolangͰ࡞Δ SQL Language Server(sqls) Go Conference 2021 Autumn Track A lighttiger2505@גࣜձࣾMobility Technologies

Slide 2

Slide 2 text

ࣗݾ঺հ lighttiger2505 / Toshikazu Ohashi • גࣜձࣾMobility Technologiesॴଐ • αʔόʔαΠυΤϯδχΞ • ޷͖ͳΤσΟλ͸Vim/NeoVim

Slide 3

Slide 3 text

ΠϯτϩμΫγϣϯ

Slide 4

Slide 4 text

sqls An implementation of the Language Server Protocol for SQL.

Slide 5

Slide 5 text

sqlsͱ͸ • Language Server Protocol(ҎԼ LSP)Λ༻͍ͯΤσΟλͱ௨৴͢ΔSQL ͷLanguage Server(ҎԼ ݴޠαʔόʔ) • LSPͱ͸ϓϩάϥϜݴޠͷ։ൃࢧԉػೳ(ҎԼ ΠϯςϦηϯε)ΛΤ σΟλʹఏڙ͢Δαʔόɺ͓Αͼͦͷ௨৴಺༰Λنఆͨ͠ϓϩτί ϧɻMicrosoft࡞

Slide 6

Slide 6 text

HPQMT(PMBOH DMBOHE$MBOH TRMT42- -BOHVBHF4FSWFS1SPUPDPM MTQ LSΫϥΠΞϯτ͕͋ΔΤσΟλͰ͋Ε͹ͲͷΤσΟλͰ΋ ݴޠͷΠϯςϦηϯεͷԸܙΛड͚Δ͜ͱ͕Ͱ͖Δ

Slide 7

Slide 7 text

ࣗಈิ׬

Slide 8

Slide 8 text

αϒΫΤϦ΋ࣗಈิ׬

Slide 9

Slide 9 text

ఆٛࢀর

Slide 10

Slide 10 text

Πϯαʔτ஋ೖྗิॿ

Slide 11

Slide 11 text

ΫΤϦ࣮ߦ

Slide 12

Slide 12 text

ຊ೔ͷΰʔϧ GoݴޠͰ࡞Γํ͕Α͘Θ͔Βͳ͍΋ͷΛ࡞Δํ๏Λڞ༗͢Δ ⊗ ࣅͨΑ͏ͳ͜ͱΛࣗ෼Ͱ΋Ͱ͖Δͱࢥͬͯ΋Β͏ ⊗ GoͰ࡞ΒΕͨศརπʔϧ͕ੈքʹ૿͑Δ

Slide 13

Slide 13 text

ΞδΣϯμ લఏ • ᶃͳͥͭ͘Δͷ͔ɻͦͷಈػ • ᶄͲ͏ͭ͘Δͷ͔ɻͦͷํ਑ ࣮ફฤ • ᶅΤσΟλͱLSPͰ௨৴͢ΔͨΊʹ͸Ͳ͏ͨ͠Β • ᶆSQLΛͲ͏΍ͬͯղੳ͢Ε͹͍͍͔ • ᶇෳ਺ͷσʔλϕʔεʹͲ͏ରԠ͢Ε͹͍͍͔ ·ͱΊ

Slide 14

Slide 14 text

ᶃͳͥͭ͘Δͷ͔ɻͦͷಈػ

Slide 15

Slide 15 text

ੈͷதʹ͸SQLͷΠϯςϦηϯε͕গͳ͍ • SQLΛૢ࡞͢Δͱ͖ࣗಈิ׬΍ఆٛࢀরͰ͖ͳ͍ͷ͕ෆຬ • ิ׬Ͱ͖ͯ΋஗͍ • ਖ਼֬͡Όͳ͍ • SELECT Expr͸ิ׬ͯ͠΋ଞͰ͸ิ׬͠ͳ͍౳ • DBπʔϧਾ͑෇͚ͷΤσΟλ্Ͱ͔͠ΠϯςϦηϯε͕ಈ࡞͠ͳ͍

Slide 16

Slide 16 text

dbcli͚͕ͩٹ͍ͩͬͨ • DBeaver, DataGripͱൺֱͯ͠΋ิ׬ ͕ਖ਼͔֬ͭߴ଎ • λʔϛφϧ͔Βଈ࣌ىಈ • ීஈ࢓ࣄͰ࢖͏Α͏ͳDB͸αϙʔτ • DB઀ଓ؅ཧ͕໘౗ • ࣗ෼ͰπʔϧΛ࡞ͬͨ

Slide 17

Slide 17 text

Ұ೥΄ͲdbcliΛ࢖ͬͨ݁Ռͷෆຬ఺ • 1ϥΠϯΤσΟλͳͷͰෳ਺ߦͷΫΤϦฤू͸ͮ͠Β͍ • αϒΫΤϦͳͲͷෳࡶͳΫΤϦͷิ׬͸Ͱ͖ͳ͍ • ΧϥϜͷৄࡉ΍ςʔϒϧͷৄࡉΛࢀর͢Δͱ͖ɺςʔϒϧৄࡉΛௐ΂ Δผ΢Οϯυ΢Λ։͍ͯࢀর͢Δඞཁ͕͋Δ

Slide 18

Slide 18 text

ݴޠαʔόʔͱLSP • ౰࣌(2018೥ͷౙࠒ)gopls͕։ൃ͞ΕɺGoͷࣗಈิ׬͸ݴޠαʔόʔ Λ࢖͏ͷ͕ྑ͍ͱ͍͏ঢ়گʹ • ΤσΟλʔ͕ΠϯςϦηϯεΛಘΔͱ͖ݴޠαʔόʔ͕ୈҰީิʹͳ Δͱ͍͏ྲྀΕ • SQLͷݴޠαʔόʔ͕͋Ε͹ɺ͢΂ͯͷ໰୊͸͢΂ͯղܾ͢ΔͷͰ͸ ͱ͍͏ண૝

Slide 19

Slide 19 text

ᶄͲ͏ͭ͘Δͷ͔ɻͦͷํ਑

Slide 20

Slide 20 text

࠷খཁ݅Λ·ͱΊΔ • LSPʹ४ڌͨ͠ϦΫΤετ/ϨεϙϯεΛฦͤΔ • SQLͷจ຺ΛཧղͰ͖Δ • ͦΕʹΑͬͯࣗಈิ׬͕Ͱ͖Δ • ෳ਺छྨͷσʔλϕʔεʹରԠ͢Δ͜ͱ͕Ͱ͖Δ • ॳظஈ֊Ͱ͸MySQLͷΈ

Slide 21

Slide 21 text

TRMT .Z42- 1PTUHSF 42- TRMJUF MTQ MTQ MTQ TRMEBUBCBTF TRMEBUBCBTF ղܾ͠ͳ͚Ε͹͍͚ͳ͍՝୊͕̏ͭ TRMEBUBCBTF SQLϑΝΠϧ

Slide 22

Slide 22 text

TRMT .Z42- 1PTUHSF 42- TRMJUF MTQ MTQ MTQ TRMEBUBCBTF TRMEBUBCBTF ΤσΟλͱLSPͰ௨৴͢ΔͨΊʹ͸Ͳ͏ͨ͠Β͍͍͔ TRMEBUBCBTF SQLϑΝΠϧ

Slide 23

Slide 23 text

TRMT .Z42- 1PTUHSF 42- TRMJUF MTQ MTQ MTQ TRMEBUBCBTF TRMEBUBCBTF TRMEBUBCBTF SQLΛղੳ͢Δʹ͸Ͳ͏͢Ε͹͍͍͔ SQLϑΝΠϧ

Slide 24

Slide 24 text

TRMT .Z42- 1PTUHSF 42- TRMJUF MTQ MTQ MTQ TRMEBUBCBTF TRMEBUBCBTF TRMEBUBCBTF ෳ਺ͷσʔλϕʔεʹͲ͏ରԠ͢Ε͹͍͍͔ SQLϑΝΠϧ

Slide 25

Slide 25 text

Θ͔ΒΜ͚Ͳ ͱΓ͋͑ͣ ࡞Ζ͏

Slide 26

Slide 26 text

ҠಈͰਓΛ޾ͤʹɻ ϞϏϦςΟςΫϊϩδʔζ ఏɹɹڙ ϓϩϞʔγϣϯΛؚΈ·͢

Slide 27

Slide 27 text

ʮҠಈͰਓΛ޾ͤʹɻʯΛϛογϣϯʹ No.1*λΫγʔΞϓϦʮGOʯ΍AIυϥϨ ίαʔϏεʮDRIVE CHARTʯͳͲΛ։ൃ ͍ͯ͠·͢ *App Annieௐ΂ʛλΫγʔ഑ंؔ࿈ΞϓϦʹ͓͚Δ೔ຊࠃ಺μ΢ϯϩʔυ਺(iOS/ Google Play߹ࢉ஋) ௐࠪظؒɿ2020೥10݄1೔ʙ2021೥9݄30೔ ϓϩϞʔγϣϯΛؚΈ·͢

Slide 28

Slide 28 text

͸GoΤϯδχΞ ΛઈࢍืूதͰ͢ ϓϩϞʔγϣϯΛؚΈ·͢

Slide 29

Slide 29 text

ᶅΤσΟλͱLSPͰ ௨৴͢ΔͨΊʹ͸Ͳ͏ͨ͠Β͍͍͔

Slide 30

Slide 30 text

TRMT .Z42- 1PTUHSF 42- TRMJUF MTQ MTQ MTQ TRMEBUBCBTF TRMEBUBCBTF ΤσΟλͱLSPͰ௨৴͢ΔͨΊʹ͸Ͳ͏ͨ͠Β͍͍͔ TRMEBUBCBTF SQLϑΝΠϧ

Slide 31

Slide 31 text

LSPʹΑΔΤσΟλͱͷ௨৴ • ΤσΟλͱݴޠαʔόʔ͸JSON-RPC 2.0Ͱ௨৴͢Δ • RPC(Remote Procedure Callͷུ)͸ݺͼग़͠ݩͱ͸ผͷϓϩάϥϜ ͷϝιουΛݺͼग़͢ • JSON-RPC͸ϝιουͷίʔϧͱϨεϙϯεΛJSONͰߦ͏ • ݴޠαʔόʔͱ͸ݴ͏͕ΤσΟλͱಉ͡PC্ʹ্ཱͪ͛ͯιέοτܦ ༝Ͱ௨৴͢Δͷ͕ओ

Slide 32

Slide 32 text

JSON-RPCͷ௨৴ྫ(ఆٛݩδϟϯϓ) { "jsonrpc": "2.0" , "id" : 1 , "method": "textDocument/definition" , "params": { "textDocument": { "uri": "file:///cpp/use.cpp " } , "position": { "line": 3 , "character": 1 2 } } } { "jsonrpc": "2.0" , "id": 1 , "result": { "uri": "file:///cpp/provide.cpp" , "range": { "start": { "line": 0 , "character": 4 } , "end": { "line": 0 , "character": 1 1 } } } } ΤσΟλ ϦΫΤετ ݴޠαʔόʔ Ϩεϙϯε

Slide 33

Slide 33 text

GolangͰͷJSON-RPCͷ࣮૷ํ๏ • Goͷ͍͍ͱ͜Ζ͸ࣅͨΑ͏ͳιϑτ΢ΣΞ͕΋͏͢Ͱʹ͋Δ ݴޠαʔόʔ ղઆ HPQMT (Pͷ։ൃνʔϜ͕։ൃ͍ͯ͠Δ(PMBOHެࣜͷݴޠαʔόʔ CJOHP TBJCJOHࢯ͕։ൃɻHPQMTҎલ͔Β͋Δ(PMBOHͷݴޠαʔόʔɻݱࡏ͸HPQMTʹ ౷߹ɻHPQMTΑΓػೳ͕গͳ͘γϯϓϧɻ࣮͸ॳظ͸ͬͪ͜Λࢀߟʹͨ͠ FGNMBOHTFSWFS NBUUOࢯ͕։ൃɻMJOUFSͷ࣮ߦ݁ՌΛύʔεͯ͠MTQܗࣜͷMJOU݁Ռ EJBHOPTUJDT ͱ͍͏ ʹม׵͠+40/31$ܗࣜͰ౉͢൚༻ݴޠαʔόʔ

Slide 34

Slide 34 text

JSON-RPCߏஙͷஈऔΓ • Ͳͷαʔόʔ΋JSON-RPC2ͷ࣮૷ʹ͸sourcegraph/jsonrpc2Λ࢖͍ͬͯΔ • efm-langserver͔Βݴޠαʔόʔͱͯ͠࠷௿ݶ੒ΓཱͭίʔυΛҾ༻ • ࠷΋γϯϓϧͳ࡞ΓͩͬͨͨΊ • sourcegraph/jsonrpc2ͱbingo͔ΒJSON-RPC2ͷςετίʔυΛҾ༻ͯ͠ ୯ମςετߏங • ࣮ࡍʹLSΫϥΠΞϯτͱૄ௨ͯ͠ਖ਼ৗಈ࡞͢Δ͜ͱΛ֬ೝ

Slide 35

Slide 35 text

ᶆSQLΛղੳ͢Δʹ͸ Ͳ͏͢Ε͹͍͍͔

Slide 36

Slide 36 text

TRMT .Z42- 1PTUHSF 42- TRMJUF MTQ MTQ MTQ TRMEBUBCBTF TRMEBUBCBTF TRMEBUBCBTF SQLΛղੳ͢Δʹ͸Ͳ͏͢Ε͹͍͍͔ SQLϑΝΠϧ

Slide 37

Slide 37 text

SQLΛղੳ͢Δʹ͸ • Golangͷgo/astύοέʔδͷΑ͏ͳղੳϥΠϒϥϦ͕ඞཁ • ϥΠϒϥϦΛ୳͢ͱҎԼͷΑ͏ͳ΋ͷ͕ݟ͔ͭΔ ύʔαʔ ղઆ YXC TRMQBSTFS 7JUFTTͱ͍͏.Z42-ͷΫϥελΛߏங͢ΔγεςϜͰར༻͞Ε͍ͯΔύʔαʔ ΛϥΠϒϥϦԽͨ͠΋ͷ BLJUP YTRMQBSTFS 3VTU੡ͷBOEZHSPWFTRMQBSTFSSTΛࢀߟʹ࡞ΒΕͨύʔαʔɻTRMTͰ͸௚઀ ࢖͍ͬͯͳ͍͕MFYFS͸΄΅͜ΕΛࢀߟʹ͍ͯ͠Δ

Slide 38

Slide 38 text

ͲͷΑ͏ͳಈ͖Λ͢Δ͔ݕূ͢Δ • SQLΛύʔεͯ͠ߏ଄ମΛprint͢Δ͚ͩͷ؆қCLIΛ࡞ͬͯݕূ package mai n import ( "fmt " "os " "github.com/k0kubun/pp " "github.com/xwb1989/sqlparser " ) func main() { stmt, err := sqlparser.Parse(os.Args[0] ) if err != nil { fmt.Println("parse error:", err ) retur n } pp.Print(stmt ) }

Slide 39

Slide 39 text

͜ͷͱ͖͸͜͏ࢥ͍ͬͯ·ͨ͠ ͳΜͩ؆୯͡Όͳ͍͔ɻ ͜ΕͳΒࣗಈิ׬΋͙ͩͧ͢ɻ

Slide 40

Slide 40 text

ݕূͷ݁Ռࣗಈิ׬ʹ͸࢖͑ͳ͍͜ͱ͕Θ͔Δ • ݕূͨ݁͠Ռɺsqls༻్Ͱ͸طଘύʔαʔ͸࢖͑ͳ͍͜ͱ͕Θ͔Δ SELECT id, | FROM city INSERT INTO city (id, |) UPDATE city SET CountryCode='USA', |

Slide 41

Slide 41 text

GOͷߏจ package mai n import "fmt " func main() { msg := "hello world " fmt.Sprintln(| } SELECT `ID` , | FROM `city ` WHERE `CountryCode` = 'USA ' ORDER BY `District` SQLͷߏจ

Slide 42

Slide 42 text

GOͷߏจ package mai n import "fmt " func main() { msg := "hello world " fmt.Sprintln(| } SELECT `ID` , | FROM `city ` WHERE `CountryCode` = 'USA ' ORDER BY `District` SQLͷߏจ • ߏจͷؔ܎্ɺ1Statement͕௕͍ • 1Statementͷதʹ(ςʔϒϧ౳)ఆٛ৘ใؚ͕·Ε͍ͯΔ

Slide 43

Slide 43 text

GOͷߏจ package mai n import "fmt " func main() { msg := "hello world " fmt.Sprintln(| } SELECT `ID` , | FROM `city ` WHERE `CountryCode` = 'USA ' ORDER BY `District` SQLͷߏจ • ߏจͷؔ܎্ɺ1Statement͕௕͍ • 1Statementͷதʹ(ςʔϒϧ౳)ఆٛ৘ใؚ͕·Ε͍ͯΔ

Slide 44

Slide 44 text

GOͷߏจ package mai n import "fmt " func main() { msg := "hello world " fmt.Println(| } SELECT `ID` , | FROM `city ` WHERE `CountryCode` = 'USA ' ORDER BY `District` SQLͷߏจ • ଞݴޠͳΒύʔεࣦഊͨ͠1StatementΛಡΈඈ͹ͯ͠ऴΘΓ • SQL͸1StatementதͷΤϥʔΛ෼ׂͯ͠ղऍ͢Δඞཁ͕͋Δ

Slide 45

Slide 45 text

ݱࡏSQLͷࣗಈิ׬͕Ͱ͖͍ͯΔOSS • dbcliγϦʔζɻPython੡ɻ֤DBͷCLIίϚϯυͷ୅ΘΓʹ࢖͏͜ͱͰ CLI্ͰΫΤϦͷࣗಈิ׬͕Ͱ͖Δ ίϚϯυ ղઆ QHDMJ QPTUHSF42-ͷ$-*ίϚϯυ୅ସ NZDMJ .Z42-ͷ$-*ίϚϯυ୅ସ MJUFDMJ 42-JUFͷ$-*ίϚϯυ୅ସ NTTRMDMJ .JDSPTPGU42-4FSWFSͷ$-*ίϚϯυ୅ସ

Slide 46

Slide 46 text

dbcliγϦʔζ͕ར༻͍ͯ͠ΔSQLύʔαʔ • andialbrecht/sqlparse • ͍Θ͘sqlparse is a non-validating SQL parser for Python. • Goͷύʔαʔͷͱ͖ͱಉ༷ʹSQLͷύʔε݁ՌΛඳը͢Δ͚ͩͷCLI ίϚϯυΛ࡞ͬͯࢼ͢ • ΤϥʔΛಡΈඈ͹ͤΔఔ౓·Ͱจ຺ͷղੳΛεΩοϓ͍ͯͨ͠

Slide 47

Slide 47 text

طଘͷSQLύʔε

Slide 48

Slide 48 text

non-validatingͳSQLύʔε

Slide 49

Slide 49 text

di f

Slide 50

Slide 50 text

di f จ຺ΛऔΒͳ͍ɻSelectͰදࣔ͢ΔΧϥϜͱ͔ςʔϒϧͷఆٛ

Slide 51

Slide 51 text

ϝϦσϝ • ϝϦοτ • ଟগͷΤϥʔ͕͋ͬͯ΋໰୊ͳ͘ύʔεͰ͖Δ • σϝϦοτ • From۟Ͱఆٛ͞ΕͨςʔϒϧΛҾ͖ग़͢ͳͲͷॲཧ͕໘౗ • lintͷ࣮૷ͱ͔௒ΊΜͲ͍͘͞(ͳͷͰ΍͍ͬͯͳ͍) • αϒΫΤϦ΍࿦ཧԋࢉࢠͳͲ࠶ؼతͳॲཧ͕೉͍͠ • αϒΫΤϦղੳͷίʔυ͸ࠓͰ΋ݟͨ͘ͳ͍

Slide 52

Slide 52 text

ཧ۶͸Θ͔͕ͬͨɺ׬શʹࣗݾྲྀͰ࣮૷͢Δͷ͸ා ͍ͷͰɺύʔαʔͮ͘ΓͷษڧΛ͢Δ͜ͱʹͨ͠ ௒͓͢͢Ίʂʂʂ

Slide 53

Slide 53 text

̍ϲ݄ษڧͯ͠Θ͔ͬͨ͜ͱ • ߏจΛղੳ͢ΔͨΊʹࣈ۟ղੳث(Lexer),ߏจղੳث(Parser)͕ඞཁ • ύʔαʔΛ࡞ΔͨΊʹύʔαʔδΣωϨʔλͳΔศརπʔϧ͕͋Δ • DSLΛఆٛͯ͠ಡΈࠐΉͱύʔαʔ(৔߹ʹΑͬͯ͸ϨΩαʔ΋)Λ ੜ੒ ࣈ۟ղੳث -FYFS ߏจղੳث 1BSTFS τʔΫϯྻ AST ιʔείʔυ

Slide 54

Slide 54 text

sqlsͷΞϓϩʔν • ύʔαʔδΣωϨʔλʔ vs ࣗ࡞ύʔαʔ • ͲͷδΣωϨʔλʔͳΒnon-validatingͳύʔαʔ͕࡞ΕΔ͔ෆ໌ • ࣗ࡞ͰύʔαʔͳΒࣗ࡞ͳͷͰͳΜͰ΋Ͱ͖Δ • ࠓࢥ͑͹tree-sitterͱ͔͋ͬͨɻษڧෆ଍ • ࣗ࡞ύʔαʔͷ࡞੒Λܾҙ • ϨΩαʔ͸xsqlparserΛࢀߟʹ͢Ε͹ͦΜͳʹ࿑ྗͳ͘࡞Εͦ͏

Slide 55

Slide 55 text

ύʔαʔ࡞Γํߨ࠲(ͦͷ̍) • andialbrecht/sqlparse͔ΒύʔεͷςετίʔυΛݟ͚ͭΔ • ҎԼΛsqlparseͱಉ౳ͷ݁Ռ͕ಘΒΕΔ·Ͱ܁Γฦ͢ 1. ύʔε͢Δର৅ΛܾΊΔ(ΧϥϜྻͱ͔) 2. ର৅Λύʔε͢ΔςετίʔυΛsqlsʹҠ২ 3. ςετίʔυͷظ଴஋Λຬͨ͢

Slide 56

Slide 56 text

ύʔαʔ࡞Γํߨ࠲(ͦͷ̎) • ςετ͠·͢ • ςετ͠·͢ • ςετ͠·͢ • ςετ͠·͢ • ςετ͠·͢ • ςετ͠·͢ςετ͠·͢ςετ͠·͢ςετ͠·͢ςετ͠·͢ςετ͠·͢ςετ͠· ͢ςετ͠·͢ςετ͠·͢ςετ͠·͢ςετ͠·͢ςετ͠·͢ςετ͠·͢ςετ͠ ·͢ςετ͠·͢ςετ͠·͢ςετ͠·͢ςετ͠·͢ςετ͠·͢ςετ͠·͢ςετ ͠·͢ςετ͠·͢ςετ͠·͢ςετ͠·͢ςετ͠·͢ςετ͠·͢…

Slide 57

Slide 57 text

ॳΊͯsqlsͰࣗಈิ׬Λ͍ͯ͠Δ༷ࢠ

Slide 58

Slide 58 text

ᶇෳ਺ͷσʔλϕʔεʹ Ͳ͏ରԠ͢Ε͹͍͍͔

Slide 59

Slide 59 text

TRMT .Z42- 1PTUHSF 42- TRMJUF MTQ MTQ MTQ TRMEBUBCBTF TRMEBUBCBTF TRMEBUBCBTF ෳ਺ͷσʔλϕʔεʹͲ͏ରԠ͢Ε͹͍͍͔ SQLϑΝΠϧ

Slide 60

Slide 60 text

੍໿ͱϧʔϧΛઃ͚Δ • sqls͸͋͘·Ͱࣗ෼ͷͨΊͷπʔϧ • ༗ঈͷDB੡඼ʹ͸ରԠ͠ͳ͍ • ։ൃऀ͍ͩ͠Ͱ઀ଓݕূ͕Ͱ͖ͳ͘ͳΔ • BigQuery • Snow fl ake • database/sqlʹޓ׵ͷ͋ΔDriver͕ͳ͍΋ͷʹ͸ରԠ͠ͳ͍

Slide 61

Slide 61 text

ΠϯλϑΣʔεΛ༻ҙ type DBRepository interface { Driver() dialect.DatabaseDrive r CurrentDatabase(ctx context.Context) (string, error ) Databases(ctx context.Context) ([]string, error ) CurrentSchema(ctx context.Context) (string, error ) Schemas(ctx context.Context) ([]string, error ) SchemaTables(ctx context.Context) (map[string][]string, error ) DescribeDatabaseTable(ctx context.Context) ([]*ColumnDesc, error ) DescribeDatabaseTableBySchema(ctx context.Context, schemaName string) ([]*ColumnDesc, error ) Exec(ctx context.Context, query string) (sql.Result, error ) Query(ctx context.Context, query string) (*sql.Rows, error ) }

Slide 62

Slide 62 text

ͳͥΠϯλϑΣʔε͕ඞཁ͔ • υϥΠό௥Ճʹඞཁͳ߲໨Λ໌ࣔ • ςʔϒϧͳͲͷϝλ৘ใͷऔಘํ๏͕DB͝ͱʹҧ͏ • mysql, postgresqlͳΒinformation_schema • sqlite3ͳΒsqlite_master

Slide 63

Slide 63 text

ΠϯλϑΣʔεΘ͚ͨ͠੒Ռ • ࣗ෼Ͱ࣮૷ͨ͠ͷ͸DB઀ଓ͸MySQL͚ͩ • PostgreSQLͱSQLite3͸mattn͞Μ • Microsoft SQL Server͸alexhokl͞Μ • ༗ঈͷDB੡඼Λ௥Ճͨ͠PullRequest͕དྷΔ͕Ϛʔδ͸͠ͳ͍

Slide 64

Slide 64 text

·ͱΊ • ڧ͍ಈػ(VimͰSQLͷิ׬͕͍ͨ͠)͕͋Ε͹ؤுΕΔ • ࡞Γํ͕Θ͔Βͳ͍ͱ͖ɺࣅͨ՝୊Λղܾ͢Δπʔϧ͸୳ͤ͹͋Δ • طଘπʔϧ/ϥΠϒϥϦ͕՝୊ʹϑΟοτ͠ͳ͚Ε͹ࣗ࡞΋ࢹ໺ʹೖΕΔ • ೰ΜͰ͍Δؒʹॻ͚ͨΓ΋͢Δ͠ɺବ໨Ͱ΋৽͍͠՝୊͕ݟ͑Δ • ෦෼ద༻Ͱ͖Δ΋ͷ͸͋ΔͷͰίʔυΛಡΉ͜ͱΛڪΕͳ͍ • ॳظείʔϓ͸Ͱ͖Δ͚ͩখ͘͢͞Δ

Slide 65

Slide 65 text

See you again όΠόΠ