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
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Hasuraにコントリビュートした話
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
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
DynamoDBの基礎を振り返りながらベクトル検索機能を理解する
musan
3
270
【DroidKaigi 2026】「アクセシビリティを利用するとき、 アクセシビリティもまたこちらを利用している」 〜マルウェアによる攻撃と防衛について〜
halunoyo
0
410
MIZARU@SPAJAM2026 第二回予選
1901drama
0
110
信頼性の目標を誰も求めてない
shubox
0
500
GKE で Pod の見方を変えたら、スケールアウト時の挙動を真に捉えられた話
stkk
0
100
新卒PdEのリアル
ryu1013
1
450
スマート反転とウェブアクセシビリティ
camiha
0
160
AI駆動開発にグラフDBを重ねてみた
satoshi256kbyte
2
760
LL言語やWebフレームワークのPostgreSQL対応 〜DBの機能がユーザーに届くまで〜
kentaroutakeda
0
140
Snowflakeで業務アプリを作ろう。 Snowflakeのアプリ機能解説&実践ガイド
ayumu_yamaguchi
1
160
Press start. Python's next generation.
willingc
PRO
3
320
XHTMLが残したもの
yosuke_furukawa
PRO
2
460
Featured
See All Featured
A brief & incomplete history of UX Design for the World Wide Web: 1989–2019
jct
2
500
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
Leveraging LLMs for student feedback in introductory data science courses - posit::conf(2025)
minecr
1
370
How to Think Like a Performance Engineer
csswizardry
28
2.8k
Self-Hosted WebAssembly Runtime for Runtime-Neutral Checkpoint/Restore in Edge–Cloud Continuum
chikuwait
0
770
Learning to Love Humans: Emotional Interface Design
aarron
275
41k
Redefining SEO in the New Era of Traffic Generation
szymonslowik
1
410
Tips & Tricks on How to Get Your First Job In Tech
honzajavorek
1
730
The untapped power of vector embeddings
frankvandijk
2
1.9k
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
2
490
Believing is Seeing
oripsolob
1
210
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