web-dev-qa-db-ja.com

GraphqlをSQLに変換しますか?

既存のSQL Serverデータベースがあり、C#を使用しています。モバイルクライアントがgraphqlをサーバーに送信するとします。このSQLを変換して、クライアントが期待するデータを取得できるようにするにはどうすればよいですか?

14
user960567

GraphQLとSQLは同じように聞こえますが、さまざまな問題を解決します。 SQLは、データベースを直接照会するために使用されます。 GraphQLは、データベース(SQLまたはクライアントライブラリ経由)、API、静的ファイルなど、あらゆる種類のデータソースのクエリに使用されます。 GraphQLは、RESTまたはアドホックAPIエンドポイントと比較できます。

1つの解決策は、GraphQL実装を自分で作成することです。 GraphQL.org には、GraphQLサーバーの実装方法と使用方法に関する多くの優れた情報があります。それがあまりにも多くの仕事であるならば、あなたはこのプロジェクトから便乗することができます: GraphQL .NET

ApolloStack などの他のGraphQL実装も検討してください。 GraphQLサーバーを.NETサーバーから分離できる場合は、ApolloStackまたは別のJavascript GraphQLサーバーを使用してデータをホストできます。

15
Alex Anderson

私は、Join MonsterリポジトリのC#バージョンの実装を検討することをお勧めします。
アンディカールソン。 https://github.com/stems/join-monster

クライアントが提供するGraphQLクエリを、最も効率的なSQLクエリに変換しようとします。現在、多対多の関係やユニオンタイプ(多態的な関連付け)はサポートされていませんが、これらの目標はリポジトリのロードマップの一部です。

EDIT 2019

現在、HasuraやPostgraphileなどの追加オプションがあります。また、Prismaは最終的にC#で利用できるようになる可能性があります

8
AjaxLeung

Postgraphile などの実装も確認できます。

基本的には、各GraphQLリクエストを検査し、ネストされたフィールドのリゾルバーを1つのSQL結合に結合して、再帰的に解決します。

3
Eli Goldberg

これを行うために私が見つけた最も成熟したオープンソース実装は https://join-monster.readthedocs.io/en/latest/ です。

それは何ですか? Join Monsterは、Node.js graphql-jsリファレンス実装用のGraphQLとSQLの間のクエリプランナーです。これは、GraphQLクエリを受け取り、GraphQLをSQLに動的に変換して、解決前に効率的なバッチデータ取得を行う関数です。必要なデータのみをフェッチします-それ以上、それ以下ではありません。

なぜ?これは、データベースクエリが多すぎるという問題、つまり「ラウンドトリップ」問題または「N + 1」問題を解決します。 -tripsは、APIサーバーとSQLデータベース間のTCP/IPスタックを介したデータのリクエストです。これをFacebookのDataLoaderの代替と考えてください。ただし、SQLに対する特定性が高く、SQLでの使用がより強力で簡単になります。

データベースからGraphQLのスキーマを自動的に作成したり、その逆を行うためのツールではありません。スキーマを自由に定義する自由と力を維持できます。 Join Monsterは、GraphQLクエリを既存のスキーマに基づくSQLクエリに単純に「コンパイル」します。既存のアプリケーションに適合し、後でシームレスに削除したり、さまざまな程度に使用したりできます。少し意見はありますが、完全なORMではありません。

それはあなたが探しているものと全く同じに見えます。


また、 https://github.com/graphile/postgraphile (これは答えとしてここに記載されています)も可能性があります。基本的には、Postgre DBにGraphQL機能をもたらします。

どちらのソリューションもニーズに合う場合があります。

1
Vadorequest

いいえ、残念ながら、GraphQLをSQLに変換することはできません。

クライアントがGraphQLでリクエストを送信している場合は、GraphQLサーバーを作成してそこからデータベースにクエリを送信するしかありません。

GraphQLはSQLではありません。 SQLはデータベースクエリ言語ですが、GraphQLはクライアント側からミドルウェアまでのクエリ言語です。

1
LordDave

まあ、それ自体がGraphQLです。これは、以前に書いたように、API呼び出しの構文またはクエリ形式にすぎません。ところで、上記のlibの1つはGraphQL .NETであり、これを使用してすべての一般的なデータベース(MSSQL、MySQL、PostgreSQL、ElasticSearchなど)への直接呼び出しを行うコンポーネントを知っています-jsonファイルにデータテーブル/フィールドを記述して準備するだけです使用する。コメントで私にpingしてください、またはそれは簡単にグーグルです(GraphQL .net api sqlのように)

0
Dmitriy