SlideShare une entreprise Scribd logo
1  sur  59
Télécharger pour lire hors ligne
SQLQL は GraphQL に
とってなんなのか
SQLQL は GraphQL に
とってなんなのか
2019/03/22 RailsDM
@yancya
Powered by Rabbit 2.2.2 and COZMIXNG
@yancya の自己紹介
Rubyist, SQList
全体の構成
基礎、考え方
諸問題の解決
SQLQL プログラミング
事例
はじまり
“SQLQL” でググると出てきます
SQLQL とは
https://somehost/sqlql みたいな URL に SQL
を送信すると、SQL 実行結果の JSON が返って
くるという概念
気をつけたいこと
サーバー側の RDBMS の SQL 処理系は便利な
のでそのまま使いたい
特に PostgreSQL が便利なので使いたい
でも SQLQL で送られてきた SQL で物理的な
テーブルを直接触らせたくはない
外に見せたくないテーブルやカラムがある
誰に見せていいというわけではないレコードがあった
りもする
サンプルアプリケーション
説明のためのアプリケーションがあります
サンプルアプリケーション
サンプルアプリケーションは GitHub のページか
らボタン1つでデプロイ出来ます
試してみてね
サンプルアプリケーションの仕様
ユーザーがコメントを投稿して、他のユーザー
が「いいね」する、よくあるやつ
サンプルアプリのテーブル
サンプルアプリのテーブル
サンプルアプリのテーブル
細かい仕様
鍵付きユーザーという概念がある
自身はユーザー自身にしか見えない
「いいね」は他のユーザーからは誰が「いいね」した
のか分からない
鍵付き投稿という概念がある
投稿したユーザー自身にしか見えない
少し複雑なクエリ
鍵付きユーザーの「いいね」について名前を
「匿名」にして出している
WITH comments AS (
SELECT comments.id, content, users.name AS user_name, comments.created_at
FROM comments JOIN users ON comments.user_id = users.id
), likes AS (
SELECT COALESCE(users.name, '匿名') AS user_name, likes.created_at, comment_id
FROM likes LEFT OUTER JOIN users ON likes.user_id = users.id
)
SELECT comments.id, content, comments.user_name
, JSON_AGG(likes ORDER BY likes.created_at DESC) AS liked_by
FROM comments JOIN likes ON likes.comment_id = comments.id
GROUP BY 1, 2, 3
CTE(Common Table Expressions)
インラインの VIEW
サブクエリに名前を付けて、クエリ中で何度
も使える
既存のデフォルトスキーマ(public)のテーブ
ル名を上書きする事が出来る
さっきのテーブルは本当は public.users とか
public.comments だけど public がデフォルトスキーマ
なので users とか comments でアクセスできる
CTE(Common Table Expressions)
users をシャドウイングしてサブセットのテー
ブルに置き換えている様子
クエリーを発行しているユーザー自身と鍵付きではな
いユーザーのレコードのみ
id, name にしかアクセス出来ない
WITH users AS (
SELECT id, name FROM users WHERE id = ? OR privacy = false
)
SELECT * FROM users
CTE(Common Table Expressions)
comments をシャドウイングしてサブセットの
テーブルに置き換えている様子
自身のと鍵付きではないコメントのレコードのみ
id, name, content, updated_at にしかアクセス出来ない
WITH comments AS (
SELECT id, name, content, updated_at FROM comments
WHERE user_id = ? OR privacy = false
)
SELECT * FROM comments
CTE(Common Table Expressions)
CTE によって予め射影される
CTE(Common Table Expressions)
CTE によって予め射影される
CTE(Common Table Expressions)
CTE によって予め射影される
問題点
Mutations が邪魔
スキーマ修飾、システムカタログテーブルへ
のアクセス
無限ループ
Mutations
INSERT, UPDATE, DELETE, CREATE,
TRUNCATE etc…
DB の状態を変えてしまう操作は一切してほし
くないので、なんとかして殺していく必要が
ある
スキーマ修飾
WITH users AS (
SELECT * FROM users WHERE false
)
SELECT * FROM users
これなら結果が0件になるが
スキーマ修飾
WITH users AS (
SELECT * FROM users WHERE false
)
SELECT * FROM public.users
元のテーブルの全カラムが全件見えてしまう
スキーマ名で修飾すると、大元のテーブルに
アクセス出来てしまうので、スキーマ修飾も
殺さないといけない
システムカタログテーブル
pg で始まるテーブルは見られたくない
pg_user 以外にもめっちゃ沢山ある
SELECT * FROM pg_user
無限ループ
再帰クエリを使うと無限ループを表現できて
しまい、殺意のあるリクエストを送り込まれ
る危険がある
とは言え、再帰クエリが使える方が嬉しいの
で、無限ループだけを殺したい
無限ループ
再帰クエリを使った無限ループの例
n が 1 〜∞まであるテーブルが生成されようとして死ぬ
WITH RECURSIVE r AS (
SELECT 1 AS n UNION ALL
SELECT n + 1 AS n FROM r
)
SELECT * FROM r
問題の解決
Mutations の除外
スキーマ修飾、システムカタログテーブルへ
のアクセス制限
無限ループ対策
Mutations の除外
複数 DB。
なるほど、これだ。Rails 6.0 すごい
複数 DB
Rails 6.0 から、replica 属性のサブのコネク
ションの設定が簡単に書けるようになった
development:
primary:
<<: *default
database: sqlql_development
readonly:
<<: *default
database: sqlql_development
replica: true
replica 属性のコネクション
SQLQL の処理をするときだけ replica 属性の
コネクションを使えば、Mutations っぽい
SQL は Rails が弾いてくれて便利っぽい
ActiveRecord::Base.connected_to(database: :readonly) do
User.first.update(name: 'hoge')
end
#=> ActiveRecord::ReadOnlyError
#=> (Write query attempted while in readonly mode...
と思うじゃん?
CTE の WITH 句は Rails 的にはホワイトリス
トに入ってないっぽい……
ActiveRecord::Base.connected_to(database: :readonly) do
ActiveRecord::Base.connection.execute(
"WITH t AS (SELECT 1 AS n) SELECT * FROM t"
)
end
#=> ActiveRecord::ReadOnlyError
#=> (Write query attempted while in readonly mode...
どういうルールなのか
rails/activerecord/lib/active_record/
connection_adapters/postgresql/
database_statements.rb
便利メソッドで正規表現を生成してるの
READ_QUERY = ActiveRecord::ConnectionAdapters::AbstractAdapter.build_read_query_regexp(
:begin, :commit, :explain, :select, :set, :show, :release, :savepoint, :rollback) # :nodoc:
private_constant :READ_QUERY
def write_query?(sql) # :nodoc:
!READ_QUERY.match?(sql)
end
モンキーパッチすっか?
じゃあ WITH もホワイトリストに入れたろ
def write_query?(sql)
read_query =
ActiveRecord::ConnectionAdapters::AbstractAdapter.build_read_query_regexp(
:begin, :commit, :explain, :select, :set,
:show, :release, :savepoint, :rollback, :with
)
!read_query.match?(sql)
end
やったー
readonly コネクションで WITH が使えるよう
になったぞ
res = ActiveRecord::Base.connected_to(database: :readonly) do
ActiveRecord::Base.connection.execute(
"WITH t AS (SELECT 1 AS n) SELECT * FROM t"
)
end
res.to_a #=> [{"n"=>1}]
本当にそれでいいのか?
そもそも、なんで WITH がホワイトリストに
入っていなかったか考えないと駄目でしょ
WITH は副作用を起こせてしまうのでは?
WITH は副作用を起こせる
この機能、めちゃくちゃ便利なんですけど、
今は邪魔ですね
res = ActiveRecord::Base.connected_to(database: :readonly) do
ActiveRecord::Base.connection.execute(
"WITH t AS (UPDATE users SET name = 'hoge' RETURNING *) SELECT * FROM t"
)
end
res.to_a #=> [{"id"=>1,"name"=>"hoge"},{"id"=>2,"name"=>"hoge"}]
DB ユーザーの権限
しゃーない
ちゃんと、DB レベルで readonly なユーザー
を作るしかない
create user readonlyuser with password 'readonlyuser' NOCREATEDB NOCREATEROLE;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO "readonlyuser";
DB ユーザーの権限
development:
primary:
<<: *default
database: sqlql_development
readonly:
<<: *default
database: sqlql_development
replica: true
username: readonlyuser
password: readonlyuser
DB は最後の砦
これで、副作用のあるクエリは DB が弾いて
くれるようになった
ActiveRecord::Base.connected_to(database: :readonly) do
ActiveRecord::Base.connection.execute(
"WITH t AS (UPDATE users SET book_name = 'hoge' RETURNING *) SELECT * FROM t"
)
end
#=> ActiveRecord::StatementInvalid
#=> (PG::InsufficientPrivilege: ERROR: permission denied for table users
テーブルホワイトリスト
SQL リクエストに含まれるはずのテーブルは
予め決まっている
ホワイトリスト方式にすれば、物理テーブル
やシステムテーブルなどへのアクセスを防げ
る
PgQuery gem
pg_query という gem がある
$ gem install pg_query
PgQuery.parse("select * from t").tables
#=> ["t"]
PgQuery gem
テーブル名をスキーマ名で修飾している SQL
を検知できる
pg_user みたいなシステムカタログテーブル
へのアクセスも検知できる
PgQuery.parse("select * from public.t").tables
#=> ["public.t"]
無限ループ対策
SQLQL の処理をする場合の実行時間に制限を
付ければ、無限には実行されないだろう
development:
primary:
<<: *default
database: sqlql_development
readonly:
<<: *default
database: sqlql_development
replica: true
variables:
statement_timeout: 3000
タイムアウトによる無限ループ対策
まぁまぁ良さそう
ActiveRecord::Base.connected_to(database: :readonly) do
ActiveRecord::Base.connection.execute(<<~SQL)
WITH RECURSIVE r AS (
SELECT 1 AS n UNION ALL
SELECT n + 1 AS n FROM r
)
SELECT * FROM r
SQL
end
#=> ActiveRecord::QueryCanceled
#=> (PG::QueryCanceled: ERROR: canceling statement due to statement timeout)
無限ループ対策
SQL の実行時間を短く制限(3秒とかに)す
れば、CTE を使った無限ループを防げる
generate_series(1, 10000000) みたいな、膨
大な行数を生成する関数の実行も途中で打ち
切れる
とは言え、DOS 攻撃に弱そう……
今後の課題として残る
SQLQL の核となる考え方
インピーダンスミスマッチ
Object から Relation へ
SQLQL プログラミング
インピーダンスミスマッチ
インピーダンスミスマッチ
誤解を恐れず言えば、オブジェクトとリレー
ション(群)との相互変換が大変という話に
思える
これを解決するために OR/M を使って頑張ってるのが
現代
Relation to Object
SQL でリレーションをオブジェクトに
Relation to Object
JSON_AGG 関数や ROW_TO_JSON 関数を
使えば、SQL でババっと JSON を生成できる
WITH users(id, "name") AS (VALUES (1, 'taro'), (2, 'jiro'))
SELECT JSON_AGG(users) AS users FROM users;
-- users
-- ---------------------------
-- [{"id":1,"name":"taro"},{"id":2,"name":"jiro"}]
-- (1 row)
Relation to Object
欲しい JSON の形でスっと出せる
WITH users(id, "name") AS (VALUES (1, 'taro'))
, comments(id, content, user_id) AS (
VALUES(1, 'aaaaaaa', 1), (2, 'bbbbbb', 1))
, t AS (
SELECT users.id, users.name, JSON_AGG(comments) as comments
FROM users JOIN comments ON users.id = comments.user_id GROUP BY 1, 2)
SELECT JSON_AGG(t) AS users FROM t;
-- users
---------------------------------------------------------------------------------
-- [{"id":1,"name":"taro","comments":[{"id":1,"content":"aaaaaaa","user_id":1}, +
-- {"id":2,"content":"bbbbbb","user_id":1}]}]
-- (1 row)
Object to Relation
逆にオブジェクトをリレーションに変換は?
Object to Relation
JSON_TO_RECORD,
JSON_TO_RECORDSET 関数を使う
with users as (
SELECT id, "name", comments
FROM JSON_TO_RECORDSET(
CONCAT('[{"id":1,"name":"taro","comments":',
'[{"id":1,"content":"aaaaaaa","user_id":1}',
',{"id":2,"content":"bbbbbb","user_id":1}]}]')::JSON
) AS t(id integer, "name" text, comments json))
select users.id, users."name", comments.id as comment_id, comments.content
from users, json_to_recordset(users.comments) AS comments(id integer, content text, user_id integer)
-- id | name | comment_id | content
------+------+------------+---------
-- 1 | taro | 1 | aaaaaaa
-- 1 | taro | 2 | bbbbbb
--(2 rows)
SQLQL プログラミング
SQL 処理系の中でプログラミングをすると、
リレーショナル代数計算を手軽に行う事が出
来る
和(UNION)、積(INTERSECT)
差(EXCEPT)、商(一言では言い表せない)
直積(CROSS JOIN)、選択(WHERE)
射影(SELECT)、結合(JOIN)
SQLQL プログラミング
オブジェクトとリレーション、相互に変換出
来るのであれば
オブジェクト界が得意な処理はオブジェクトに変換し
て行う
リレーション界が得意な処理はリレーションに変換し
て行う
RDB に保存したいときも然り
SQLQL プログラミング
オブジェクト界が得意な処理と、リレーショ
ン界が得意な処理とは……
SQL脳から見たRubyという発表 2015/11/08 by yancya
JOIN とか WINDOW 関数の処理をアプリケーション側
で書くのは結構大変
RDB からデータを取ってくるついでに、不得意な処理
も任せてしまいたい
GraphQL の話はどうした
GraphQL App 内で SQLQL を呼び出して実行
認可の層として使えるのではないか
まとめ
SQLQL のサンドボックスは多少マシになった
フロントエンドが持ってるオブジェクトをリ
レーションに変換して API の向こうにある
DB と JOIN して、欲しいデータとして受け取
れたら楽しい
Powered by Rabbit 2.2.2 and COZMIXNG

Contenu connexe

Tendances

明日から使える Java SE 7
明日から使える Java SE 7明日から使える Java SE 7
明日から使える Java SE 7Yuichi Sakuraba
 
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8y_taka_23
 
光のMySQL 5.7
光のMySQL 5.7光のMySQL 5.7
光のMySQL 5.7yoku0825
 
Cocoa勉強会#6-SQLiteをCocoaで使う
Cocoa勉強会#6-SQLiteをCocoaで使うCocoa勉強会#6-SQLiteをCocoaで使う
Cocoa勉強会#6-SQLiteをCocoaで使うMasayuki Nii
 
Oracle Database Connect 2017 / JPOUG#1
Oracle Database Connect 2017 / JPOUG#1Oracle Database Connect 2017 / JPOUG#1
Oracle Database Connect 2017 / JPOUG#1Noriyoshi Shinoda
 
おもにEXcelだけで出来る自動化技術
おもにEXcelだけで出来る自動化技術おもにEXcelだけで出来る自動化技術
おもにEXcelだけで出来る自動化技術Takanobu Mizuta
 
What's New in MySQL 5.7 Security
What's New in MySQL 5.7 SecurityWhat's New in MySQL 5.7 Security
What's New in MySQL 5.7 SecurityMikiya Okuno
 
Wpfと非同期
Wpfと非同期Wpfと非同期
Wpfと非同期yone64
 
Introduction to cocoa sql mapper
Introduction to cocoa sql mapperIntroduction to cocoa sql mapper
Introduction to cocoa sql mappermavelph
 
わかった気になるMySQL
わかった気になるMySQLわかった気になるMySQL
わかった気になるMySQLyoku0825
 
Scala EE 7 Essentials
Scala EE 7 EssentialsScala EE 7 Essentials
Scala EE 7 Essentialstnoda
 
RxJava on Android
RxJava on AndroidRxJava on Android
RxJava on Androidyo_waka
 
MySQLの全文検索に関するあれやこれや
MySQLの全文検索に関するあれやこれやMySQLの全文検索に関するあれやこれや
MySQLの全文検索に関するあれやこれやyoku0825
 
MySQL 5.7にやられないためにおぼえておいてほしいこと
MySQL 5.7にやられないためにおぼえておいてほしいことMySQL 5.7にやられないためにおぼえておいてほしいこと
MySQL 5.7にやられないためにおぼえておいてほしいことyoku0825
 
My sql casual_in_fukuoka_vol1
My sql casual_in_fukuoka_vol1My sql casual_in_fukuoka_vol1
My sql casual_in_fukuoka_vol1Makoto Haruyama
 
オープンソースでExcelレポートプログラミング
オープンソースでExcelレポートプログラミングオープンソースでExcelレポートプログラミング
オープンソースでExcelレポートプログラミングSho Okada
 
Windows スクリプトセミナー WMI編 VBScript&WMI
Windows スクリプトセミナー WMI編 VBScript&WMIWindows スクリプトセミナー WMI編 VBScript&WMI
Windows スクリプトセミナー WMI編 VBScript&WMIjunichi anno
 
MySQL 5.7の次のMySQL 8.0はどんなものになるだろう
MySQL 5.7の次のMySQL 8.0はどんなものになるだろうMySQL 5.7の次のMySQL 8.0はどんなものになるだろう
MySQL 5.7の次のMySQL 8.0はどんなものになるだろうyoku0825
 
mysqlcasual6-fabric
mysqlcasual6-fabricmysqlcasual6-fabric
mysqlcasual6-fabricdoublemarket
 

Tendances (20)

明日から使える Java SE 7
明日から使える Java SE 7明日から使える Java SE 7
明日から使える Java SE 7
 
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
 
光のMySQL 5.7
光のMySQL 5.7光のMySQL 5.7
光のMySQL 5.7
 
Cocoa勉強会#6-SQLiteをCocoaで使う
Cocoa勉強会#6-SQLiteをCocoaで使うCocoa勉強会#6-SQLiteをCocoaで使う
Cocoa勉強会#6-SQLiteをCocoaで使う
 
Oracle Database Connect 2017 / JPOUG#1
Oracle Database Connect 2017 / JPOUG#1Oracle Database Connect 2017 / JPOUG#1
Oracle Database Connect 2017 / JPOUG#1
 
おもにEXcelだけで出来る自動化技術
おもにEXcelだけで出来る自動化技術おもにEXcelだけで出来る自動化技術
おもにEXcelだけで出来る自動化技術
 
What's New in MySQL 5.7 Security
What's New in MySQL 5.7 SecurityWhat's New in MySQL 5.7 Security
What's New in MySQL 5.7 Security
 
Wpfと非同期
Wpfと非同期Wpfと非同期
Wpfと非同期
 
Introduction to cocoa sql mapper
Introduction to cocoa sql mapperIntroduction to cocoa sql mapper
Introduction to cocoa sql mapper
 
わかった気になるMySQL
わかった気になるMySQLわかった気になるMySQL
わかった気になるMySQL
 
Scala EE 7 Essentials
Scala EE 7 EssentialsScala EE 7 Essentials
Scala EE 7 Essentials
 
RxJava on Android
RxJava on AndroidRxJava on Android
RxJava on Android
 
MySQLの全文検索に関するあれやこれや
MySQLの全文検索に関するあれやこれやMySQLの全文検索に関するあれやこれや
MySQLの全文検索に関するあれやこれや
 
MySQL 5.7にやられないためにおぼえておいてほしいこと
MySQL 5.7にやられないためにおぼえておいてほしいことMySQL 5.7にやられないためにおぼえておいてほしいこと
MySQL 5.7にやられないためにおぼえておいてほしいこと
 
My sql casual_in_fukuoka_vol1
My sql casual_in_fukuoka_vol1My sql casual_in_fukuoka_vol1
My sql casual_in_fukuoka_vol1
 
オープンソースでExcelレポートプログラミング
オープンソースでExcelレポートプログラミングオープンソースでExcelレポートプログラミング
オープンソースでExcelレポートプログラミング
 
Windows スクリプトセミナー WMI編 VBScript&WMI
Windows スクリプトセミナー WMI編 VBScript&WMIWindows スクリプトセミナー WMI編 VBScript&WMI
Windows スクリプトセミナー WMI編 VBScript&WMI
 
MySQL 5.7の次のMySQL 8.0はどんなものになるだろう
MySQL 5.7の次のMySQL 8.0はどんなものになるだろうMySQL 5.7の次のMySQL 8.0はどんなものになるだろう
MySQL 5.7の次のMySQL 8.0はどんなものになるだろう
 
Gossip事始め
Gossip事始めGossip事始め
Gossip事始め
 
mysqlcasual6-fabric
mysqlcasual6-fabricmysqlcasual6-fabric
mysqlcasual6-fabric
 

Similaire à SQLQL は GraphQL にとってなんなのか

Handlersocket 20110517
Handlersocket 20110517Handlersocket 20110517
Handlersocket 20110517akirahiguchi
 
C# Database操作1 接続と切断-
C# Database操作1  接続と切断-C# Database操作1  接続と切断-
C# Database操作1 接続と切断-Hiroki Takahashi
 
Lisp Tutorial for Pythonista : Day 4
Lisp Tutorial for Pythonista : Day 4Lisp Tutorial for Pythonista : Day 4
Lisp Tutorial for Pythonista : Day 4Ransui Iso
 
linq.js - Linq to Objects for JavaScript
linq.js - Linq to Objects for JavaScriptlinq.js - Linq to Objects for JavaScript
linq.js - Linq to Objects for JavaScriptYoshifumi Kawai
 
uroboroSQLの紹介 (OSC2017 Nagoya) #oscnagoya
uroboroSQLの紹介 (OSC2017 Nagoya) #oscnagoyauroboroSQLの紹介 (OSC2017 Nagoya) #oscnagoya
uroboroSQLの紹介 (OSC2017 Nagoya) #oscnagoyaKenichi Hoshi
 
MySQL Cluster7.3 GAリリース記念セミナー! MySQL & NoSQL 圧倒的な進化を続けるMySQLの最新機能!
MySQL Cluster7.3 GAリリース記念セミナー! MySQL & NoSQL 圧倒的な進化を続けるMySQLの最新機能!MySQL Cluster7.3 GAリリース記念セミナー! MySQL & NoSQL 圧倒的な進化を続けるMySQLの最新機能!
MySQL Cluster7.3 GAリリース記念セミナー! MySQL & NoSQL 圧倒的な進化を続けるMySQLの最新機能!yoyamasaki
 
進化したのはサーバだけじゃない!〜DBA の毎日をもっと豊かにするユーティリティのすすめ〜
進化したのはサーバだけじゃない!〜DBA の毎日をもっと豊かにするユーティリティのすすめ〜進化したのはサーバだけじゃない!〜DBA の毎日をもっと豊かにするユーティリティのすすめ〜
進化したのはサーバだけじゃない!〜DBA の毎日をもっと豊かにするユーティリティのすすめ〜Michitoshi Yoshida
 
activerecord-oracle_enhanced-adapterのご紹介
activerecord-oracle_enhanced-adapterのご紹介activerecord-oracle_enhanced-adapterのご紹介
activerecord-oracle_enhanced-adapterのご紹介Kevin Toyoda
 
Handlersocket etc. 20110906
Handlersocket etc. 20110906Handlersocket etc. 20110906
Handlersocket etc. 20110906akirahiguchi
 
Let s database_testing
Let s database_testingLet s database_testing
Let s database_testingYuji Shimada
 
開発者なのに運用で手がいっぱい? そんなあなたに贈る、 クラウド時代に最適な OSS の RDBMS ! Azure Database for MySQL...
開発者なのに運用で手がいっぱい? そんなあなたに贈る、 クラウド時代に最適な OSS の RDBMS ! Azure Database for MySQL...開発者なのに運用で手がいっぱい? そんなあなたに贈る、 クラウド時代に最適な OSS の RDBMS ! Azure Database for MySQL...
開発者なのに運用で手がいっぱい? そんなあなたに贈る、 クラウド時代に最適な OSS の RDBMS ! Azure Database for MySQL...Suguru Ito
 
SQL大量発行処理をいかにして高速化するか
SQL大量発行処理をいかにして高速化するかSQL大量発行処理をいかにして高速化するか
SQL大量発行処理をいかにして高速化するかShogo Wakayama
 
Linux 対応だけじゃない!! sql server 2017 こんな機能が追加されています。
Linux 対応だけじゃない!! sql server 2017 こんな機能が追加されています。Linux 対応だけじゃない!! sql server 2017 こんな機能が追加されています。
Linux 対応だけじゃない!! sql server 2017 こんな機能が追加されています。Masayuki Ozawa
 
今更だけどSqLite触ってみたよ
今更だけどSqLite触ってみたよ今更だけどSqLite触ってみたよ
今更だけどSqLite触ってみたよKeisuke Oohata
 
SQL Server コンテナ入門(Docker編)
SQL Server コンテナ入門(Docker編)SQL Server コンテナ入門(Docker編)
SQL Server コンテナ入門(Docker編)Tomoyuki Oota
 
第8回KPF発表資料
第8回KPF発表資料第8回KPF発表資料
第8回KPF発表資料cryks
 
HandlerSocket plugin for MySQL
HandlerSocket plugin for MySQLHandlerSocket plugin for MySQL
HandlerSocket plugin for MySQLakirahiguchi
 
PostgreSQL10徹底解説
PostgreSQL10徹底解説PostgreSQL10徹底解説
PostgreSQL10徹底解説Masahiko Sawada
 
LINEのMySQL運用について
LINEのMySQL運用についてLINEのMySQL運用について
LINEのMySQL運用についてLINE Corporation
 

Similaire à SQLQL は GraphQL にとってなんなのか (20)

Handlersocket 20110517
Handlersocket 20110517Handlersocket 20110517
Handlersocket 20110517
 
C# Database操作1 接続と切断-
C# Database操作1  接続と切断-C# Database操作1  接続と切断-
C# Database操作1 接続と切断-
 
Lisp Tutorial for Pythonista : Day 4
Lisp Tutorial for Pythonista : Day 4Lisp Tutorial for Pythonista : Day 4
Lisp Tutorial for Pythonista : Day 4
 
linq.js - Linq to Objects for JavaScript
linq.js - Linq to Objects for JavaScriptlinq.js - Linq to Objects for JavaScript
linq.js - Linq to Objects for JavaScript
 
Embulk 20150411
Embulk 20150411Embulk 20150411
Embulk 20150411
 
uroboroSQLの紹介 (OSC2017 Nagoya) #oscnagoya
uroboroSQLの紹介 (OSC2017 Nagoya) #oscnagoyauroboroSQLの紹介 (OSC2017 Nagoya) #oscnagoya
uroboroSQLの紹介 (OSC2017 Nagoya) #oscnagoya
 
MySQL Cluster7.3 GAリリース記念セミナー! MySQL & NoSQL 圧倒的な進化を続けるMySQLの最新機能!
MySQL Cluster7.3 GAリリース記念セミナー! MySQL & NoSQL 圧倒的な進化を続けるMySQLの最新機能!MySQL Cluster7.3 GAリリース記念セミナー! MySQL & NoSQL 圧倒的な進化を続けるMySQLの最新機能!
MySQL Cluster7.3 GAリリース記念セミナー! MySQL & NoSQL 圧倒的な進化を続けるMySQLの最新機能!
 
進化したのはサーバだけじゃない!〜DBA の毎日をもっと豊かにするユーティリティのすすめ〜
進化したのはサーバだけじゃない!〜DBA の毎日をもっと豊かにするユーティリティのすすめ〜進化したのはサーバだけじゃない!〜DBA の毎日をもっと豊かにするユーティリティのすすめ〜
進化したのはサーバだけじゃない!〜DBA の毎日をもっと豊かにするユーティリティのすすめ〜
 
activerecord-oracle_enhanced-adapterのご紹介
activerecord-oracle_enhanced-adapterのご紹介activerecord-oracle_enhanced-adapterのご紹介
activerecord-oracle_enhanced-adapterのご紹介
 
Handlersocket etc. 20110906
Handlersocket etc. 20110906Handlersocket etc. 20110906
Handlersocket etc. 20110906
 
Let s database_testing
Let s database_testingLet s database_testing
Let s database_testing
 
開発者なのに運用で手がいっぱい? そんなあなたに贈る、 クラウド時代に最適な OSS の RDBMS ! Azure Database for MySQL...
開発者なのに運用で手がいっぱい? そんなあなたに贈る、 クラウド時代に最適な OSS の RDBMS ! Azure Database for MySQL...開発者なのに運用で手がいっぱい? そんなあなたに贈る、 クラウド時代に最適な OSS の RDBMS ! Azure Database for MySQL...
開発者なのに運用で手がいっぱい? そんなあなたに贈る、 クラウド時代に最適な OSS の RDBMS ! Azure Database for MySQL...
 
SQL大量発行処理をいかにして高速化するか
SQL大量発行処理をいかにして高速化するかSQL大量発行処理をいかにして高速化するか
SQL大量発行処理をいかにして高速化するか
 
Linux 対応だけじゃない!! sql server 2017 こんな機能が追加されています。
Linux 対応だけじゃない!! sql server 2017 こんな機能が追加されています。Linux 対応だけじゃない!! sql server 2017 こんな機能が追加されています。
Linux 対応だけじゃない!! sql server 2017 こんな機能が追加されています。
 
今更だけどSqLite触ってみたよ
今更だけどSqLite触ってみたよ今更だけどSqLite触ってみたよ
今更だけどSqLite触ってみたよ
 
SQL Server コンテナ入門(Docker編)
SQL Server コンテナ入門(Docker編)SQL Server コンテナ入門(Docker編)
SQL Server コンテナ入門(Docker編)
 
第8回KPF発表資料
第8回KPF発表資料第8回KPF発表資料
第8回KPF発表資料
 
HandlerSocket plugin for MySQL
HandlerSocket plugin for MySQLHandlerSocket plugin for MySQL
HandlerSocket plugin for MySQL
 
PostgreSQL10徹底解説
PostgreSQL10徹底解説PostgreSQL10徹底解説
PostgreSQL10徹底解説
 
LINEのMySQL運用について
LINEのMySQL運用についてLINEのMySQL運用について
LINEのMySQL運用について
 

Plus de yancya

Opencv by-yancya
Opencv by-yancyaOpencv by-yancya
Opencv by-yancyayancya
 
どう書く日記
どう書く日記どう書く日記
どう書く日記yancya
 
BigQuery の relation 生成
BigQuery の relation 生成BigQuery の relation 生成
BigQuery の relation 生成yancya
 
use_legacy_sql=false
use_legacy_sql=falseuse_legacy_sql=false
use_legacy_sql=falseyancya
 
Relation の館
Relation の館Relation の館
Relation の館yancya
 
なんか
なんかなんか
なんかyancya
 
SQL 脳から見た Ruby
SQL 脳から見た RubySQL 脳から見た Ruby
SQL 脳から見た Rubyyancya
 
evacuate_from_sti
evacuate_from_stievacuate_from_sti
evacuate_from_stiyancya
 
A investigative report of refinements
A investigative report of refinementsA investigative report of refinements
A investigative report of refinementsyancya
 
RubyWorld Conference 2012 へ何で行ったのか
RubyWorld Conference 2012 へ何で行ったのかRubyWorld Conference 2012 へ何で行ったのか
RubyWorld Conference 2012 へ何で行ったのかyancya
 

Plus de yancya (10)

Opencv by-yancya
Opencv by-yancyaOpencv by-yancya
Opencv by-yancya
 
どう書く日記
どう書く日記どう書く日記
どう書く日記
 
BigQuery の relation 生成
BigQuery の relation 生成BigQuery の relation 生成
BigQuery の relation 生成
 
use_legacy_sql=false
use_legacy_sql=falseuse_legacy_sql=false
use_legacy_sql=false
 
Relation の館
Relation の館Relation の館
Relation の館
 
なんか
なんかなんか
なんか
 
SQL 脳から見た Ruby
SQL 脳から見た RubySQL 脳から見た Ruby
SQL 脳から見た Ruby
 
evacuate_from_sti
evacuate_from_stievacuate_from_sti
evacuate_from_sti
 
A investigative report of refinements
A investigative report of refinementsA investigative report of refinements
A investigative report of refinements
 
RubyWorld Conference 2012 へ何で行ったのか
RubyWorld Conference 2012 へ何で行ったのかRubyWorld Conference 2012 へ何で行ったのか
RubyWorld Conference 2012 へ何で行ったのか
 

Dernier

デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)UEHARA, Tetsutaro
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?akihisamiyanaga1
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)Hiroshi Tomioka
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NTT DATA Technology & Innovation
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineerYuki Kikuchi
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...博三 太田
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfFumieNakayama
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfFumieNakayama
 

Dernier (8)

デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
 

SQLQL は GraphQL にとってなんなのか