Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
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
840
perlをWebAssembly上で動かすと何が嬉しいの??? / Where does Perl-on-Wasm actually make sense?
mackee
0
1.4k
Agentに至る道 〜なぜLLMは自動でコードを書けるようになったのか〜
mackee
6
6.6k
今!ソフトウェアエンジニアがハードウェアに手を出すには
mackee
14
7.5k
ワンバイナリWebサービスのススメ
mackee
10
9.2k
tanukistack ライブコーディング / tanukistack live-coding
mackee
0
890
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.2k
Other Decks in Programming
See All in Programming
カツオ、ご期待ください
suneo3476
0
130
MVNOの申込からeSIM開通までをiOSアプリでつなぐ- 本人確認・MNP・通信事業者基盤をまたぐ実装
satotakeshi
0
520
コードレビューのボトルネックを"する側"と"される側"の両面から解消する
yub0n
2
1.3k
標準パッケージに uuid が追加された 背景から見る Go らしい意思決定 / go_127_uuid_decision
convto
5
9.4k
APNsからLive Activityを開始する話
yumnumm
0
120
20260914 AIエージェント時代のPlatform Engineering LLM基盤とプロダクトの責務境界線
kanfab1
7
2.3k
Herb in Rails 8.2: Your ERB views, now HTML-aware @ Rails World 2026, Austin, Texas
marcoroth
0
150
AGENTS.md Is Not Enough:Build Skills, Don't Download Them
lx_t
0
130
JPUG勉強会 OSSデータベースの内部構造を理解しよう(第2回)
oga5
0
290
UPDATE をやめる — EF Core でマスタをバージョン管理する
panda728
PRO
0
1.1k
Vue Fes Japan 2026 タイムテーブル徹底解説
448jp
1
590
Go × SIMDで高速化するベクトル検索 ~ルーフラインモデルでSIMDが効く境界を探れ! ~
po3rin
1
5.8k
Featured
See All Featured
Applied NLP in the Age of Generative AI
inesmontani
PRO
4
2.5k
How to Think Like a Performance Engineer
csswizardry
28
2.8k
Max Prin - Stacking Signals: How International SEO Comes Together (And Falls Apart)
techseoconnect
PRO
0
470
Winning Ecommerce Organic Search in an AI Era - #searchnstuff2025
aleyda
2
2.2k
Data-driven link building: lessons from a $708K investment (BrightonSEO talk)
szymonslowik
1
1.3k
Speed Design
sergeychernyshev
33
2.1k
Noah Learner - AI + Me: how we built a GSC Bulk Export data pipeline
techseoconnect
PRO
0
440
Mobile First: as difficult as doing things right
swwweet
225
10k
[RailsConf 2023] Rails as a piece of cake
palkan
59
7k
Between Models and Reality
mayunak
4
480
Amusing Abliteration
ianozsvald
1
320
SERP Conf. Vienna - Web Accessibility: Optimizing for Inclusivity and SEO
sarafernandez
2
1.6k
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 ͳͲͲ͏͔ͱݴΘΕ͍ͯΔ
Ҏ্ʂ