Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Go向けORM sqllaの紹介と JOINやUNIONを含んだクエリの扱い方
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
mackee
August 26, 2023
Programming
5.3k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Go向けORM sqllaの紹介と JOINやUNIONを含んだクエリの扱い方
湘南.pm #1
https://shonanpm.connpass.com/event/289094/
mackee
August 26, 2023
More Decks by mackee
See All by mackee
Go1.27で導入されるジェネリクスメソッドでできること
mackee
0
97
perlをWebAssembly上で動かすと何が嬉しいの??? / Where does Perl-on-Wasm actually make sense?
mackee
0
970
Agentに至る道 〜なぜLLMは自動でコードを書けるようになったのか〜
mackee
6
5.8k
今!ソフトウェアエンジニアがハードウェアに手を出すには
mackee
14
7k
ワンバイナリWebサービスのススメ
mackee
10
8.8k
tanukistack ライブコーディング / tanukistack live-coding
mackee
0
660
range over funcの使い道と非同期N+1リゾルバーの夢 / about a range over func
mackee
0
1.2k
perl for shell, awk and sed programmers
mackee
3
2.8k
今更GoのWebフレームワークを作ろうとしているワケ / Why am I trying to create a Go web framework now?
mackee
1
1.1k
Other Decks in Programming
See All in Programming
Modding RubyKaigi for Myself
yui_knk
0
920
脅威をエンジニアリングの糧にして――現場編 / Turning Threats into Engineering Fuel — Field Edition
nrslib
0
270
The ROI of Quarkus for Spring Boot Applications
hollycummins
0
110
ユニットテストの先へ:テスト技法で要求・仕様を整理するJava開発実践 / Beyond_Unit_Testing_Practical_Java_Development_Techniques_for_Organizing_Requirements_and_Specifications
shimashima35
0
390
Technical Debt: Understanding it Rightly, Engaging it Rightly #LaravelLiveJP
shogogg
0
220
Language Server 使ってる? 〜VSCode と Zed の場合〜 / Are you using a Language Server? ~For VS Code and Zed~
handlename
0
780
Javaの型とAI時代に型が大事な理由 / java types and type in AI era
kishida
2
120
AI時代のUIはどこへ行く?その2!
yusukebe
21
7k
過去最大のMCPアップデート! 2026-07-28 RC版の謎に迫る
licux
6
240
タクシーアプリ『GO』の バックエンド開発のおける AI利活用と若者のすべて
pyama86
3
2k
Spec Driven Development | AI Summit Lisbon
danielsogl
PRO
0
180
Spring Security 実践 ─ GraphQL APIで実務に役立つ 認証・認可 を学ぶ
wagyu
0
220
Featured
See All Featured
How to Get Subject Matter Experts Bought In and Actively Contributing to SEO & PR Initiatives.
livdayseo
0
140
Paper Plane (Part 1)
katiecoart
PRO
0
8.8k
Getting science done with accelerated Python computing platforms
jacobtomlinson
2
220
GraphQLの誤解/rethinking-graphql
sonatard
75
12k
Tell your own story through comics
letsgokoyo
1
950
Bridging the Design Gap: How Collaborative Modelling removes blockers to flow between stakeholders and teams @FastFlow conf
baasie
0
580
Agile Leadership in an Agile Organization
kimpetersen
PRO
0
160
Art, The Web, and Tiny UX
lynnandtonic
304
22k
Future Trends and Review - Lecture 12 - Web Technologies (1019888BNR)
signer
PRO
0
3.6k
Visual Storytelling: How to be a Superhuman Communicator
reverentgeek
2
560
Producing Creativity
orderedlist
PRO
348
40k
AI: The stuff that nobody shows you
jnunemaker
PRO
8
710
Transcript
Go͚ORM sqllaͷհͱ JOINUNIONΛؚΜͩΫΤϦ ͷѻ͍ํ macopy a.k.a @mackee_w 2023-08-26 ভೆ.pm #1
ࢲͱ • macopy X: @mackee_w • Perl͕͖ Goͱྑ͠ • ීஈ3DϓϦϯλΛԆʑͱ͍͍ͬͯ͡
·͢ • ࣸਅϥεϕΨεͰϏʔϧͰ͢
sqllaͱ • Go͚ORM • SQLͷΈཱͯʹඞཁͳϝ ιουΛDBεΩʔϚఆ͔ٛΒ ίʔυੜ͢Δͷ͕ಛ • ࢲ(macopy)͕࡞ɾϝϯςφ ϯεΛ͍ͯ͠·͢
• gitHub.com/mackee/go-sqlla
sqllaͷചΓ • ςʔϒϧͷΧϥϜʹରԠͨ͠ϝιου͕ίʔυੜ͞ΕΔͷͰɺิ ʹग़ͯ͘Δ • `column IN (…)`, όϧΫΠϯαʔτ, `INSERT
~ ON DUPLICATEKEY UPDATE` ʹରԠ • ϑϨʔϜϫʔΫύοέʔδߏʹڧ͘ґଘ͠ͳ͍ͷͰɺҰ෦͚ͩ sqllaΛೖΕΔ͜ͱ͕Մೳ
ଞͷORMͱൺΔͱ ʮsqlla͕Βͳ͍͜ͱʯͰհ͢Δํ͕ ࡍཱͭ
ͦͦORMͬͯ ͳʹ
Object-Relational Mapper/Mapping • ͭ·ΓRDBMSͷΫΤϦ݁ՌΛϓϩάϥϛϯάݴޠݻ༗ͷΦϒδΣΫ τʹϚοϐϯά͢Δߦҝ, ͦ͘͠ΕΛΔπʔϧ/ϥΠϒϥϦ
͜͜ͰΈͳ͞Μɺ಄ͷதͰ ORMͱݴΘΕΔϥΠϒϥϦΛࢥ͍ු ͔ग़͍ͯͩ͘͞
Django ORM, SQLAlchemy, Peewee, Pony ORM, Tortoise ORM, Hibernate, EclipseLink,
JOOQ, MyBatis, ActiveJDBC, ActiveRecord, Sequel, DataMapper, Entity Framework, Dapper, LINQ to SQL, Massive, Eloquent ORM, Doctrine ORM, Propel, Sequelize, TypeORM, Waterline, Objection.js, GORM, xorm, Storm, Pop, Exposed, Ktorm, OrmLite ChatGPTʹͰ͖Δ͚ͩྻڍͯ͠ͱ͓ئ͍ͨ͠(ͳ͍ͷ͕͋Δ͔)
Perlͩͱ • Class::DBI • DBIx::Class • Teng • Aniki •
Otogiri
࠶ܝ: Object-Relational Mapper/Mapping • ͭ·ΓRDBMSͷΫΤϦ݁ՌΛϓϩάϥϛϯάݴޠݻ༗ͷΦϒδΣΫ τʹϚοϐϯά͢Δߦҝ, ͦ͘͠ΕΛΔπʔϧ/ϥΠϒϥϦ
͕ͩɺੈͷதͰݴΘΕ͍ͯΔ ORM ͦΕҎ֎ͷࣄΛ͍ͬͯΔ
ΫΤϦϏϧμʔ • ϓϩάϥϛϯάݴޠͷγϯλοΫεͰDMLΛΈཱͯΔ Teng(Perl)
εΩʔϚཧ • RDBMSͷDDLΛݴޠͷγϯλοΫεͰఆٛͨ͠Γɺͦ͘͠ͷٯ มΛߦ͏ gorm(Go)
εΩʔϚϚΠάϨʔγϣϯ • ͢Ͱʹ͋ΔDBͷDDLΛɺతͷঢ়ଶͷDDLʹͳΔΑ͏ʹมԽͤ͞Δ ActiveRecord(Ruby)
ଞʹ͜Μͳػೳ͕ • ૠೖ࣌ɾߋ৽࣌ϑοΫ • DBͷܕͱϓϩάϥϛϯάݴޠͷܕͷม • in fl ate/de fl
ateͳͲͱݺΕͨΓ͢Δ • ίωΫγϣϯϓʔϦϯά
݁ہͷͱ͜ΖɺRDBMSΛ͏·͘ѻ͏ ͨΊͷϥΠϒϥϦͩͬͨΓ ͦΜͳϥΠϒϥϦͷதͷҰͭͷػೳͱ ͯ͠ORM͕͋Δ
sqllaԿΛͬͯԿΛΒͳ͍͔
sqllaͷػೳ • ΫΤϦϏϧμʔ • ߋ৽࣌ɾૠೖ࣌ϑοΫ • ORM • Ҏ্ʂ
sqlla͕Βͳ͍͜ͱ • εΩʔϚϚΠάϨʔγϣϯ • DBίωΫγϣϯཧ • ߴͳܕม
DBίωΫγϣϯΛ࣋ͨͳ͍ͱ ΫΤϦ࣮ߦ࣌ʹຖճʹsqlla.DB interfaceΛຬͨ͢ΦϒδΣΫτΛ͢
sqlla͚ͩͩͱ͖͍ͭͷͰɺݱ࣮తʹ͜͏ͯ͠ ·͢ • εΩʔϚཧ github.com/mackee/go-genddl • sqllaޓͷstruct͔ΒDDLΛग़ྗ͢Δ • εΩʔϚϚΠάϨʔγϣϯ github.com/k0kubun/sqldef
• DDL͔ΒALTERจΛੜ͢Δ • ίωΫγϣϯཧ database/sql • ΧϥϜͷܕͱGoͷܕͷ૬ޓม֤driverʹ͍ͤͯΔ • ήετͷshogo82148͞Μ(go-sql-driver/mysqlͷίϯτϦϏϡʔλʔ)ײँͯ͠·͢ʂ
࠷ۙͷΈ ʮJOINΛsqllaͰѻ͍͍ͨʯ
ORMʹ͓͚ΔJOIN • ୯ମςʔϒϧΛҾ࣌͘RDBMSͷ݁Ռͷܗ͕มΘΔ͜ͱ͋Μ·Γ ͳ͍ • ΧϥϜ͕ݮΔ͙Β͍ • JOINΛ͢ΔͱΧϥϜ͕૿ݮ͢Δ ΧϥϜͷܕೖΓࠞͬͯ͡͠·͏ •
੩తʹఆٛͨ͠ΦϒδΣΫτʹϚοϐϯά͕Ͱ͖ͳ͍ ͜ͱ͕͋Δ
ݱঢ়ͷsqllaͷJOINͷѻ͍ํ
ݱঢ়ͷ • ୯Ұͷstructʹ͔͠ಉ࣌ʹϚοϐϯά͕Ͱ͖ͳ͍ • ྫͩͱaccountςʔϒϧͷΈ • ෳʹඥ͚ͮΔʹ ToSqlͰSQLΛు͖ͭͭखಈͰScanΛճ͍ͯ͠ Δ
ΞΠσΟΞ: ϏϡʔΛ͏ͷͲ͏͔ • ϏϡʔΛͬͯJOIN͞ΕͨΫΤϦͱ୯ମͷςʔϒϧʹݟ͔͚ͤΔ • ϏϡʔͳΒUNIONѻ͑Δ
None
͜ΕͰ͍͍Μ͡Όͳ͍ʁʁ
͍ͭͰʹgenddlଆͰVIEWΛ࡞ΕΔΑ͏ʹ͢Δ
͏গ͍᩵ͨ͠͠ • ݩʑͷςʔϒϧͷΧϥϜΛؙ͝ͱ͖͍࣋ͬͯͨ • ݸผͷςʔϒϧΛUPDATEͨ͘͠ͳͬͨΓ͢Δέʔε • structʹϏδωεϩδοΫͷϝιουΛషΓ͚͍ͯΔέʔε • TonamelͩͱActiveRecordύλʔϯతʹͦ͏͍͏;͏ʹ͍ͯ͠Δ
Ͱ͖ΔΑ͏ʹͯ͠Έͨ
͏·͍͖ͦ͘͏(࣮ݧத)
՝ • Where۟༻ͷϝιουͰ໊લ͕ඃͬͨΒͲ͏͢Δͷ͔ • Account.IDAccountID(v, operator…)ʹͳΔ͕ɺ͜ͷ๏ଇͰ͍͘ͱඃͬͯ͠·͏͜ͱ͕͋Δͷ Ͱɾɾɾʁ • Ҋ֎ͳ͍͔ʁ •
εΩʔϚϚΠάϨʔγϣϯ࣌ʹϏϡʔͷΧϥϜ͕৯͍ҧͬͯഁ໓͠ͳ͍͔Ͳ͏͔ • ςετͰΘ͔Δ͔Βେৎʁɹͨͩ `u.*` Έ͍ͨͳࢦఆΛ͢ΔͱɺDML࣮ߦத͏ʹരൃ͢Δ͔ • MySQLͰsqldefΛ͏ࡍʹϏϡʔΛؚΜͩDDLΛ͏ͱৗʹ͕ࠩൃੜ͢Δ • ຊମʹڍಈΛվળ͢ΔPull RequestΛૹΕͳ͍͔ௐࠪத… ࠙ձͰ୭͔ʹฉ͔͘
ͦͷଞ sqlla ʹؔ͢Δల • Goͷdatabase/sqlʹNull[T]͕ೖͬͨΒଈରԠ͢ΔͭΓͰ͢ • ΧελϜςϯϓϨʔτ • sqllaͷੜ࣌ͷςϯϓϨʔτΛϨσΟϝΠυͷͷ͡Όͳͯ͘Ϣʔ βʔ͕࡞ͬͨͷΛద༻Ͱ͖ΔΑ͏ʹ͢Δ
• υΩϡϝϯτ • sqlla handbook ͳͲͲ͏͔ͱݴΘΕ͍ͯΔ
Ҏ্ʂ