У нас есть существующая база данных SQL Server, и мы используем С#. Допустим, наш мобильный клиент отправит graphql на сервер. Как я могу преобразовать этот SQL, чтобы мой клиент получил данные, что он ожидал?
Преобразование Graphql в SQL?
Ответ 1
GraphQL и SQL при одинаковом звучании решают разные проблемы. SQL используется для непосредственного запроса базы данных. GraphQL используется для запроса источников данных любого типа, таких как базы данных (через SQL или клиентские библиотеки), API и статические файлы. GraphQL можно сравнить с конечными точками REST или ad-hoc API.
Одним из решений было бы создать реализацию GraphQL самостоятельно. GraphQL.org содержит много отличной информации о том, как реализовать и использовать сервер GraphQL. Если вы слишком много работаете, вы можете избавиться от этого проекта: GraphQL.NET
Также рассмотрим другие реализации GraphQL, такие как ApolloStack. Если у вас может быть ваш сервер GraphQL отдельно от вашего .NET-сервера, вы можете использовать ApolloStack или другой сервер Javascript GraphQL для размещения ваших данных.
Ответ 2
Я предлагаю вам изучить реализацию версии С# в репозитории Join Monster, написанную с помощью Энди Карлсон. https://github.com/stems/join-monster
Он пытается преобразовать предоставленный клиентом запрос GraphQL в наиболее эффективный возможный SQL-запрос. В настоящее время он не поддерживает отношения "многие ко многим" или типы профсоюзов (полиморфные ассоциации), но эти цели являются частью дорожной карты репозитория.
Ответ 3
Нет, к сожалению, вы не можете преобразовать GraphQL в SQL.
Если ваш клиент отправляет вам запрос в GraphQL, у вас нет выбора, кроме как создать ваш сервер GraphQL и запросить базу данных.
GraphQL не является SQL. Хотя SQL является языком запросов базы данных, GraphQL является языком запросов с клиентской стороны и промежуточным программным обеспечением.
Ответ 4
Вы также можете взглянуть на реализацию, такую как Postgraphile
Он в основном проверяет каждый запрос GraphQL и объединяет средства разрешения вложенных полей в одно соединение SQL, которое затем рекурсивно разрешается.
Ответ 5
Ну, сам GraphQL это просто синтаксис или формат запроса для вызова API, как парни писали ранее. Кстати, одна из библиотек lib, упомянутых выше, это GraphQL.NET, и я знаю компонент, который использует ее для прямых вызовов всех популярных баз данных (таких как MSSQL, MySQL, PostgreSQL или даже ElasticSearch) - просто опишите таблицы данных/поля в файле json и готово использовать. пинг мне в комментарии или он легко гуглится (что-то вроде GraphQL.net api sql)
Ответ 6
Самая зрелая реализация с открытым исходным кодом, которую я нашел для этого, - https://join-monster.readthedocs.io/en/latest/
Что это? Join Monster - это планировщик запросов между GraphQL и SQL для эталонной реализации Node.js graphql-js. Это функция, которая принимает запрос GraphQL и динамически переводит GraphQL в SQL для эффективного пакетного извлечения данных перед разрешением. Он выбирает только те данные, которые вам нужны - ни больше, ни меньше.
Зачем? Это решает проблему создания слишком большого количества запросов к базе данных, то есть проблему "туда-обратно" или проблему "N + 1", где в обоих направлениях - это запросы данных через стек TCP/IP между вашим сервером API и вашей базой данных SQL., Думайте об этом как об альтернативе Facebook DataLoader, но с большей специфичностью к SQL, что делает его более мощным и простым в использовании с SQL.
Это НЕ инструмент для автоматического создания схемы для вашего GraphQL из вашей базы данных или наоборот. Вы сохраняете свободу и власть определять свои схемы так, как вы хотите. Join Monster просто "компилирует" запрос GraphQL в запрос SQL на основе существующих схем. Он вписывается в существующие приложения и может быть легко удален позже или использован в различной степени. Это немного самоуверенный, но не полный ORM.
Это выглядит именно так, как вы ищете.
Кроме того, https://github.com/graphile/postgraphile (который упоминается в качестве ответа здесь) является еще одной возможностью. Это в основном приносит возможности GraphQL в БД Postgre.
Оба решения могут соответствовать вашим потребностям.