Рубрики
Без рубрики

Как динамически создавать схему GraphQL?

Всем привет. 🤩 Я пишу эту статью, чтобы помочь вам создать динамическую схему GraphQL p… Помечено как graphql, java, для начинающих, с открытым исходным кодом.

Всем привет. 🤩 Я пишу эту статью, чтобы помочь вам создать динамическую схему GraphQL программно в виде кода java. Для этого мы в первую очередь будем использовать библиотеку graphql-java .

Схема GraphQL

GraphQL имеет свою систему типов, которая используется для определения схемы API. Синтаксис для написания схем называется Языком определения схем (SDL). Мы можем либо определить схему с помощью SDL, либо определить ее программно в виде кода java. Но оба они являются статическими способами представления. В случае, если вы создаете схему во время выполнения, становится трудно рекурсивно добавлять новые поля в ваше предопределенное определение.

Определение схемы SDL

type Customer {
   name : String
   address : String
   contact : Int 
}

Определение программной схемы

GraphQLObjectType.Builder graphQLObjectType = GraphQLObjectType.newObject();
graphQLObjectType.name("Customer")
                 .field(newFieldDefinition()
                       .name("name")
                       .type(Scalars.GraphQLString))
                 .field(newFieldDefinition()
                       .name("address")
                       .type(Scalars.GraphQLString))
                 .field(newFieldDefinition()
                       .name("conatct")
                       .type(Scalars.GraphQLInt)
                 .build();

Мы сосредоточимся на том, как извлечь метаданные источника данных, к которому вы подключаетесь. Метаданные характеризуют ваши данные и облегчают их понимание и использование любым пользователем. Проще говоря, метаданные – это данные, описывающие данные, которые хранятся в вашем источнике данных. Обычно он включает имя, размер и количество строк каждой таблицы, присутствующей в базе данных, а также столбцы в каждой таблице, их типы данных, точность и т.д.

Давайте начнем! 🚀

Для чтения и хранения метаданных базы данных мы будем использовать два интерфейса Данные базы данных и Набор результатов . Интерфейс DatabaseMetaData огромен, содержит сотни методов для чтения возможностей СУБД. Вы можете обратиться к Javadoc для получения полного списка методов.

Получение экземпляра DatabaseMetaData

Здесь я использую jdbc-url для Teiid , вы также можете выбрать другие. Мы получаем объект DatabaseMetaData из объекта Подключения , например:

String URL = "jdbc:teiid:customer@mm://localhost:31000";
String USERNAME = "sa";
String PASSWORD = "sa";
Connection connection = DriverManager.getConnection(URL, USERNAME ,PASSWORD );
DatabaseMetaData databaseMetaData = connection.getMetaData();

Список Таблиц Базы данных

Мы можем получить список определенных таблиц в вашей базе данных или источнике данных с помощью DatabaseMetaData. Вот как это делается:

String table[] = {"TABLE"};

ResultSet resultSet = databaseMetaData.getTables(null,null,null,table);
ArrayList tables = new ArrayList();

    while(resultSet.next()) {
        tables.add(resultSet.getString("TABLE_NAME"));
    }

Список Столбцов Базы данных

Мы можем получить столбцы таблицы с помощью объекта DatabaseMetaData таким образом:

ResultSet columns = databaseMetaData.getColumns(null,null, tableName, null);
     while(columns.next()) {
         String columnName = columns.getString("COLUMN_NAME");
         String datatype = columns.getString("DATA_TYPE");
         String columnsize = columns.getString("COLUMN_SIZE");

         System.out.println(columnName + "---" + datatype + "---" + columnsize);
      }

Создание схемы

Следующим шагом будет создание схемы с использованием объекта GraphQLObjectType , сохранение соответствующих метаданных в HashMap и считывание ее типа из класса ReturnType , определенного в следующем разделе.

ResultSet resultSet = databaseMetaData.getColumns(null, null, (String) tableName, null);

     GraphQLObjectType objectType = null;
     GraphQLObjectType.Builder graphQLObjectType = GraphQLObjectType.newObject();

     System.out.println("-------Schema for Table " + tableName + "-------");
     HashMap  data  = new HashMap<>();

      while (resultSet.next()) {
           data.put(resultSet.getString("COLUMN_NAME"), resultSet.getString("TYPE_NAME"));

           for (Map.Entry hm : data.entrySet()) {

                graphQLObjectType
                        .name(tableName)
                        .field(GraphQLFieldDefinition.newFieldDefinition()
                                .name(hm.getKey())
                                .type(ReturnType(hm.getValue())));
                objectType = graphQLObjectType.build();

            }
        }

Определение типа поля в схеме

Этот класс возвращает тип поля в каждом случае, здесь я определил только два типа GraphQL Длинный и Графическая строка . Вы можете определить соответственно для других типов.

public static GraphQLScalarType ReturnType(String type) {
      if(type.equals("long"))
           return Scalars.GraphQLLong;
      else if (type.equals("string"))
           return Scalars.GraphQLString;
      return null;
    }
}

Схема построения и печати

Для печати схемы мы используем определенный способ Принтер схемы объект, который принимает объект типа GraphQLSchema.

GraphQLSchema graphQLSchema = GraphQLSchema.newSchema()
                    .query(objectType)
                    .build();

SchemaPrinter schemaPrinter = new SchemaPrinter();
String printer = schemaPrinter.print(graphQLSchema);
System.out.println(printer);

Вывод

Вот оно у вас! Вы успешно подключились к источнику данных для извлечения метаданных базы данных и, используя данные, создали свою схему GraphQL.

Вы можете посетить репозиторий Github Конструктор схем для просмотра исходного кода. Также проверьте GraphQL Java веб-сайт, чтобы узнать больше.

Ты учишься. Я учусь. Мы все учимся. Давайте продолжим учиться и становиться лучше вместе. Спасибо. Приятного Чтения! 🎉

Вы можете связаться со мной по Твиттер и LinkedIn ❤️

Оригинал: “https://dev.to/anisha/how-to-create-graphql-schema-dynamically-353a”