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
Hasuraにコントリビュートした話
Search
Nakano as a Service
February 10, 2023
Programming
72
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
24
例外はスローするなリターンし ろ
nakanoasaservice
1
89
TypeScript type challengesを解いてみよう
nakanoasaservice
0
150
Other Decks in Programming
See All in Programming
A2UI という光を覗いてみる
satohjohn
1
110
tsserverとは何だったのか、これからどうなるのか
nowaki28
1
450
プロパティの順序で型推論が壊れる!? TypeScript6.0の修正からContext-Sensitivityの仕組みを追う
bicstone
2
1.3k
気づいたらRubyで100作品 ー クリエイティブコーディングが生活の一部になるまで / 100 Ruby Sketches Later: How Creative Coding Became Part of My Life
chobishiba
3
550
セキュリティの専門家じゃなくてもできる。「セキュリティ意識」をアップデートして サプライチェーン攻撃への耐性を高めよう。
tk3fftk
5
660
技術記事、AIに書かせるか、自分で書くか? 〜それでも私が自分の手で書く理由〜 / #QiitaConference
jnchito
2
1.3k
代数的データ型って何が嬉しいの? #frontend_phpcon_do
kajitack
8
3.2k
「AIで開発し、AIを届ける」をEvalでつなぐ 〜AIネイティブに始めるプロダクト開発の実践〜 / Connecting "Develop with AI, deliver AI" with Eval
rkaga
4
4.7k
今さら聞けないCancellationToken
htkym
0
220
関係性から理解する"同一性"の型用語たち
pvcresin
2
640
Spec-Driven Development with AI-Agents: From High-Level Requirements to Working Software
antonarhipov
2
470
軽量Java基盤の設計 DIコンテナに頼らない、長期保守と1秒起動の実現 JJUG CCC 2026 Spring
macha64
0
460
Featured
See All Featured
Measuring Dark Social's Impact On Conversion and Attribution
stephenakadiri
2
210
Google's AI Overviews - The New Search
badams
0
1k
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
600
Navigating Weather and Climate Data
rabernat
0
210
The untapped power of vector embeddings
frankvandijk
2
1.7k
The Impact of AI in SEO - AI Overviews June 2024 Edition
aleyda
5
1.1k
The Limits of Empathy - UXLibs8
cassininazir
1
350
Fashionably flexible responsive web design (full day workshop)
malarkey
408
66k
Navigating Team Friction
lara
192
16k
Rails Girls Zürich Keynote
gr2m
96
14k
Design of three-dimensional binary manipulators for pick-and-place task avoiding obstacles (IECON2024)
konakalab
0
440
Hiding What from Whom? A Critical Review of the History of Programming languages for Music
tomoyanonymous
2
840
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