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.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
200
perlをWebAssembly上で動かすと何が嬉しいの??? / Where does Perl-on-Wasm actually make sense?
mackee
0
1k
Agentに至る道 〜なぜLLMは自動でコードを書けるようになったのか〜
mackee
6
5.9k
今!ソフトウェアエンジニアがハードウェアに手を出すには
mackee
14
7.1k
ワンバイナリWebサービスのススメ
mackee
10
8.8k
tanukistack ライブコーディング / tanukistack live-coding
mackee
0
690
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
Lessons from Spec-Driven Development
simas
PRO
0
230
Oxlintのカスタムルールの現況
syumai
6
1.2k
「AIで開発し、AIを届ける」をEvalでつなぐ 〜AIネイティブに始めるプロダクト開発の実践〜 / Connecting "Develop with AI, deliver AI" with Eval
rkaga
4
5.5k
肥大化するレガシーコードに立ち向かうためのインターフェース分離と依存の逆転 / JJUG CCC 2026 Spring
hirokunimaeta
0
640
SREは、MCPとSRE Agentをこう使え!
kazumax55
0
130
Oxcを導入して開発体験が向上した話
yug1224
4
350
TAKTでAI駆動開発の品質を設計する
j5ik2o
7
1.6k
Datadog × OpenTelemetry 入門と実践のあいだ
kn_to_maxpno
1
180
IBM Bobを活用したレガシーアプリの最新化
oniak3ibm
PRO
1
220
才能?センス?知らん、 続けたもん勝ちだ。-- 結婚・出産・癌を越えてなお、私がプロダクトを創り続ける理由
16bitidol
1
570
セキュリティの専門家じゃなくてもできる。「セキュリティ意識」をアップデートして サプライチェーン攻撃への耐性を高めよう。
tk3fftk
5
990
ECSアプリログをFireLensでコスト削減しようとしたけど諦めた話 in Fargate×Node.js
akihisaikeda
2
4.2k
Featured
See All Featured
The Invisible Side of Design
smashingmag
301
52k
We Analyzed 250 Million AI Search Results: Here's What I Found
joshbly
1
1.4k
Everyday Curiosity
cassininazir
0
240
Code Reviewing Like a Champion
maltzj
528
40k
Faster Mobile Websites
deanohume
310
32k
The browser strikes back
jonoalderson
0
1.3k
Future Trends and Review - Lecture 12 - Web Technologies (1019888BNR)
signer
PRO
0
3.6k
Java REST API Framework Comparison - PWX 2021
mraible
34
9.4k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
231
55k
Applied NLP in the Age of Generative AI
inesmontani
PRO
4
2.3k
Measuring & Analyzing Core Web Vitals
bluesmoon
9
870
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
37
6.5k
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 ͳͲͲ͏͔ͱݴΘΕ͍ͯΔ
Ҏ্ʂ