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
75
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
26
例外はスローするなリターンし ろ
nakanoasaservice
1
92
TypeScript type challengesを解いてみよう
nakanoasaservice
0
160
Other Decks in Programming
See All in Programming
ルールを書いて終わらせないハーネスエンジニアリング
yug1224
4
1.9k
【QA Test Talk Vol.8】AI-DLC による Whole Team Approach の加速
pkshadeck
PRO
0
180
the container ship “Apple Silicon”@WWDC26 Recap -Japan-\(region).swift
shingangan
0
120
AIを紡ぐPMのお話
swdtkuy
0
100
yield再入門 #phpcon
o0h
PRO
0
1.1k
今さら聞けない .NET CLI
htkym
0
190
FDEが実現するAI駆動経営の現在地
gonta
2
280
170k Jobs a Day on GKE: Scaling Mercari's CI Platform - and What's Next for AI-Native Development
junyaokabe
0
110
What's New in Android 2026
veronikapj
0
260
自動化したのに回らないテスト運用の壁ーAI時代の品質責任と生産性
mfunaki
0
130
React本体のコードリーディング
high_g_engineer
1
140
仕様駆動開発の消費期限
watany
20
8.3k
Featured
See All Featured
30 Presentation Tips
portentint
PRO
1
370
The SEO identity crisis: Don't let AI make you average
varn
0
530
エンジニアに許された特別な時間の終わり
watany
108
250k
Taking LLMs out of the black box: A practical guide to human-in-the-loop distillation
inesmontani
PRO
3
2.3k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
47
8.3k
VelocityConf: Rendering Performance Case Studies
addyosmani
332
25k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
141
35k
How to Grow Your eCommerce with AI & Automation
katarinadahlin
PRO
1
240
How to Get Subject Matter Experts Bought In and Actively Contributing to SEO & PR Initiatives.
livdayseo
0
170
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
1.1k
Tell your own story through comics
letsgokoyo
1
1k
The Limits of Empathy - UXLibs8
cassininazir
1
600
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