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
Hasuraにコントリビュートした話
Search
Nakano as a Service
February 10, 2023
Programming
76
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Hasuraにコントリビュートした話
Nakano as a Service
February 10, 2023
More Decks by Nakano as a Service
See All by Nakano as a Service
StripeとNotion、AIで作る決済自動化の裏側
nakanoasaservice
0
27
例外はスローするなリターンし ろ
nakanoasaservice
1
92
TypeScript type challengesを解いてみよう
nakanoasaservice
0
160
Other Decks in Programming
See All in Programming
Ghostty + Neovimで作る 透明でカッコ良い開発環境
j341nono
0
150
JRuby: Past, Present, and Future
headius
0
220
IBM Bob Dojo #1 仕様駆動開発入門
oniak3ibm
PRO
0
320
モバイル交通系ICへのチャージ実例から考える、クロスプラットフォーム開発におけるiOS実機テスト設計とCI運用
yusuga
1
570
Security issues being discussed on Web Platforms
petamoriken
0
1.4k
MVNOの申込からeSIM開通までをiOSアプリでつなぐ- 本人確認・MNP・通信事業者基盤をまたぐ実装
satotakeshi
0
520
iOSDCのペンライトを自動制御したい!
akkeylab
0
340
Java 27新機能 / Java 27 new features
kishida
2
190
Go × SIMDで高速化するベクトル検索 ~ルーフラインモデルでSIMDが効く境界を探れ! ~
po3rin
1
5.9k
AI Agent時代のリアーキテクチャ戦略と実践
hokaccha
9
5.3k
Agentic Software Factoryに、すごく賢いIF文を。 / super smart IF statement into the Agentic Software Factory.
rkaga
0
350
テストを司るデーモンに会いに行く 〜隔離した仮想マシンでテストを通すまで〜
h1d3mun3
1
600
Featured
See All Featured
How to build an LLM SEO readiness audit: a practical framework
nmsamuel
2
930
Optimizing for Happiness
mojombo
378
71k
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
730
What the history of the web can teach us about the future of AI
inesmontani
PRO
1
720
Site-Speed That Sticks
csswizardry
13
1.5k
Max Prin - Stacking Signals: How International SEO Comes Together (And Falls Apart)
techseoconnect
PRO
0
470
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
1
340
Designing for Timeless Needs
cassininazir
1
510
XXLCSS - How to scale CSS and keep your sanity
sugarenia
250
1.3M
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
360
31k
Mind Mapping
helmedeiros
1
390
How to Build an AI Search Optimization Roadmap - Criteria and Steps to Take #SEOIRL
aleyda
1
2.2k
Transcript
Hasuraにコントリビュートした話 1
自己紹介 中野 匡浩(まさひろ) 24歳 ハンドルネーム: Nakano as a Service 福岡スタートアップ 株式会社デンタライト
ジニーメモリーという製品のプロダクトオーナー インフラ・バックエンド・フロントエンドまんべんなくできるなんでも屋さん 2
話すこと 1. Hasuraとは 2. デンタライトでの活用方法 3. デンタライトで遭遇したバグ 4. どうやって直したか 5.
感想 3
とは SQLデータベースの前段に置くと GraphQL APIが生えてくるOSS PostgreSQL, SQLServer, BigQuery などに対応 4
例: Userテーブルから名前が田中太郎のユーザーを引く id name 1 田中太郎 2 山田花子 # Hasura
に出すGraphQL クエリ query GetUserByName { user(where: { name: { _eq: " 田中太郎" }}) { id name } } -- Hasura がDB から引くクエリ select id, name from User where name=' 田中太郎'; 5
Hasuraの便利機能: Permission 条件に合致するレコードしか引けないようにする機能 6
例: deleted_atに値がない( is null )レコードしか引けないようにPermissionで設定 id name deleted_at 1 田中太郎
2023/02/09 2 山田花子 # Hasura に出す全件取得のクエリ query GetAllUser { user { id name } } select id, name from User where deleted_at is null; -- 暗黙的にwhere がつく [{id: 2, name: " 山田花子"}] 7
デンタライトでの活用方法 弊社ではジニーメモリーのバックエンドに採用している おかげでサーバーのコードは殆ど書かずに済んでいる データベースには弊社共通のMicrosoft SQLServerを用いている 8
デンタライトで遭遇した問題 SQLServerではPermissionで is null が使えない Inconsistent object: in table \"user\":
in permission for role \"user\": Unknown operator: _is_null is null ? 知らない演算子ですね (意訳) 弊社では deleted_at に削除日を入れて削除したことにする運用(論理削除) ないと結構困る 9
色々検証した結果 PostgreSQLでは使える Hasuraは主にPostgreSQLを前提に作られている Permissionでは設定できないがクエリでは is null が使える つまり以下のようなクエリは通る query GetNotDeletedUser
{ user(where: { deleted_at: { _is_null: true }}) {id, name} } クエリは出せるのだから、Permissionさえ直せばよいのでは? PostgreSQLのPermissionの実装が参考になるのでは? → 自分でも直せるのでは? 10
やったこと1: エラー文でリポジトリ内を検索 Inconsistent object: in table \"user\": in permission for
role \"user\": Unknown operator: _is_null Unknown Operator で検索するとPermissionのMSSQLの場合の実装がヒット case opStr of "_eq" -> parseEq "$eq" -> parseEq "_neq" -> parseNeq "$neq" -> parseNeq ... x -> throw400 UnexpectedPayload $ "Unknown operator: " <> x ここでPermissionに設定したオペレーターごとに場合分けをしているようだ そもそもここに _is_null が無くて Unknown Operator が出ていたようだ 11
やったこと2: PostgreSQLの実装と見比べた 似たような場所にPostgreSQLの場合の実装もあったので見比べる case opStr of ... "$eq" -> parseEq
"_eq" -> parseEq ... "$is_null" -> parseIsNull "_is_null" -> parseIsNull ... x -> throw400 UnexpectedPayload $ "Unknown operator: " <> x 確かにここには _is_null がある 12
やったこと3: PostgreSQLの実装をコピーした parseIsNull の実装は単純だったので、SQLServerの実装にコピーした parseIsNull = bool ANISNOTNULL ANISNULL <$>
parseVal -- is null ... parseVal :: (FromJSON a) => m a parseVal = decodeValue val 13
これだけでis null が使えるようになった! 14
やったこと4: プルリクを出した 15
結果 Hasura社の方からマージするよとリプライが来た! 16
感想 メンテナが気づかない些細なことは結構ある 意外と自分で直せる ビルドの方が大変だった マージされるとうれしい みんなもPR出してみてね 17