既存のSQL Serverデータベースがあり、C#を使用しています。モバイルクライアントがgraphqlをサーバーに送信するとします。このSQLを変換して、クライアントが期待するデータを取得できるようにするにはどうすればよいですか?
GraphQLとSQLは同じように聞こえますが、さまざまな問題を解決します。 SQLは、データベースを直接照会するために使用されます。 GraphQLは、データベース(SQLまたはクライアントライブラリ経由)、API、静的ファイルなど、あらゆる種類のデータソースのクエリに使用されます。 GraphQLは、RESTまたはアドホックAPIエンドポイントと比較できます。
1つの解決策は、GraphQL実装を自分で作成することです。 GraphQL.org には、GraphQLサーバーの実装方法と使用方法に関する多くの優れた情報があります。それがあまりにも多くの仕事であるならば、あなたはこのプロジェクトから便乗することができます: GraphQL .NET
ApolloStack などの他のGraphQL実装も検討してください。 GraphQLサーバーを.NETサーバーから分離できる場合は、ApolloStackまたは別のJavascript GraphQLサーバーを使用してデータをホストできます。
私は、Join MonsterリポジトリのC#バージョンの実装を検討することをお勧めします。
アンディカールソン。 https://github.com/stems/join-monster
クライアントが提供するGraphQLクエリを、最も効率的なSQLクエリに変換しようとします。現在、多対多の関係やユニオンタイプ(多態的な関連付け)はサポートされていませんが、これらの目標はリポジトリのロードマップの一部です。
EDIT 2019
現在、HasuraやPostgraphileなどの追加オプションがあります。また、Prismaは最終的にC#で利用できるようになる可能性があります
Postgraphile などの実装も確認できます。
基本的には、各GraphQLリクエストを検査し、ネストされたフィールドのリゾルバーを1つのSQL結合に結合して、再帰的に解決します。
これを行うために私が見つけた最も成熟したオープンソース実装は 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機能をもたらします。
どちらのソリューションもニーズに合う場合があります。
いいえ、残念ながら、GraphQLをSQLに変換することはできません。
クライアントがGraphQLでリクエストを送信している場合は、GraphQLサーバーを作成してそこからデータベースにクエリを送信するしかありません。
GraphQLはSQLではありません。 SQLはデータベースクエリ言語ですが、GraphQLはクライアント側からミドルウェアまでのクエリ言語です。
まあ、それ自体がGraphQLです。これは、以前に書いたように、API呼び出しの構文またはクエリ形式にすぎません。ところで、上記のlibの1つはGraphQL .NETであり、これを使用してすべての一般的なデータベース(MSSQL、MySQL、PostgreSQL、ElasticSearchなど)への直接呼び出しを行うコンポーネントを知っています-jsonファイルにデータテーブル/フィールドを記述して準備するだけです使用する。コメントで私にpingしてください、またはそれは簡単にグーグルです(GraphQL .net api sqlのように)