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
mackee
August 26, 2023
Programming
5.4k
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
800
perlをWebAssembly上で動かすと何が嬉しいの??? / Where does Perl-on-Wasm actually make sense?
mackee
0
1.2k
Agentに至る道 〜なぜLLMは自動でコードを書けるようになったのか〜
mackee
6
6.3k
今!ソフトウェアエンジニアがハードウェアに手を出すには
mackee
14
7.4k
ワンバイナリWebサービスのススメ
mackee
10
9.1k
tanukistack ライブコーディング / tanukistack live-coding
mackee
0
810
range over funcの使い道と非同期N+1リゾルバーの夢 / about a range over func
mackee
0
1.2k
perl for shell, awk and sed programmers
mackee
3
2.9k
今更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
FDEとは、何者なのか?
masapyon1212
0
110
コンパウンドプロダクト開発のためのローカルプロセスマネージャー再発明 #layerxgo
izumin5210
0
610
{ Android | Kotlin } Gradle Plugin in 2026
ryunen344
1
230
LLMは4年分のCompose移行を再現できるのか?実プロダクト279件のXMLで探る自動化の境界線
makun
0
260
楽しそうなつよつよエンジニアと目が死んでる僕/A brilliant engineer having a blast, and dead-eyed me.
3l4l5
2
270
異なる設計思想のフレームワークを経験して得た学び
amekuhideki
2
1.4k
PyO3 で既存 Python 評価器を Rust core 化する ー wasm-bindgen でブラウザにも配るための設計
kdash
1
130
ALB ログから Trace を気合で繋げる技術
fohte
7
840
ソフトウェアラスタライザ
fadis
1
760
T3DD26: From RAGs to Riches
martinhelmich
0
130
[DroidKaigi 26] How We Moved from Android Studio to Slack
thisaay
0
150
Cloudflare is Agents
chimame
0
190
Featured
See All Featured
What’s in a name? Adding method to the madness
productmarketing
PRO
24
4.1k
How to Talk to Developers About Accessibility
jct
2
530
The Director’s Chair: Orchestrating AI for Truly Effective Learning
tmiket
1
290
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.6k
Groundhog Day: Seeking Process in Gaming for Health
codingconduct
0
320
VelocityConf: Rendering Performance Case Studies
addyosmani
331
25k
Leveraging LLMs for student feedback in introductory data science courses - posit::conf(2025)
minecr
1
370
How to Ace a Technical Interview
jacobian
281
24k
The #1 spot is gone: here's how to win anyway
tamaranovitovic
3
1.1k
Fashionably flexible responsive web design (full day workshop)
malarkey
408
67k
Visualization
eitanlees
152
17k
Build your cross-platform service in a week with App Engine
jlugia
234
19k
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 ͳͲͲ͏͔ͱݴΘΕ͍ͯΔ
Ҏ্ʂ