Подтвердить что ты не робот

Как подключить GraphQL и PostgreSQL

GraphQL имеет мутации, Postgres имеет INSERT; У GraphQL есть запросы, Postgres имеет SELECT; и т.д. и т.д. Я не нашел примера, показывающего, как вы могли бы использовать оба проекта, например, передавать все запросы из интерфейса (React, Relay) в GraphQL, но фактически хранить данные в Postgres.

Кто-нибудь знает, что Facebook использует как DB и как он связан с GraphQL?

Является единственной возможностью хранения данных в Postgres прямо сейчас для создания пользовательских "адаптеров", которые берут запрос GraphQL и преобразуют его в SQL?

4b9b3361

Ответ 1

GraphQL является агностиком базы данных, поэтому вы можете использовать то, что обычно используете для взаимодействия с базой данных, и использовать метод query или mutation resolve для вызова функции, которую вы определили, которая получит/добавит что-то в базу данных.

Без реле

Вот пример мутации с использованием конструктора запросов Knex SQL, сначала без реле, чтобы получить представление о концепции. Я предполагаю, что вы создали userType в своей схеме GraphQL, которая имеет три поля: id, username и created: все необходимые, и что у вас есть уже определенная функция getUser, какие запросы базы данных и возвращает объект пользователя. В базе данных у меня также есть столбец password, но поскольку я не хочу, чтобы этот запрос оставил его из моего userType.

// db.js
// take a user object and use knex to add it to the database, then return the newly
// created user from the db.
const addUser = (user) => (
  knex('users')
  .returning('id') // returns [id]
  .insert({
    username: user.username,
    password: yourPasswordHashFunction(user.password),
    created: Math.floor(Date.now() / 1000), // Unix time in seconds
  })
  .then((id) => (getUser(id[0])))
  .catch((error) => (
    console.log(error)
  ))
);

// schema.js
// the resolve function receives the query inputs as args, then you can call
// your addUser function using them
const mutationType = new GraphQLObjectType({
  name: 'Mutation',
  description: 'Functions to add things to the database.',
  fields: () => ({
    addUser: {
      type: userType,
      args: {
        username: {
          type: new GraphQLNonNull(GraphQLString),
        },
        password: {
          type: new GraphQLNonNull(GraphQLString),
        },
      },
      resolve: (_, args) => (
        addUser({
          username: args.username,
          password: args.password,
        })
      ),
    },
  }),
});

Поскольку Postgres создает для меня id, и я вычисляю временную метку created, мне они не нужны в моем запросе на мутацию.

Релейный путь

Использование помощников в graphql-relay и прилипание, довольно близкое к

Ответ 2

Мы рассматриваем эту проблему в Join Monster - библиотеку, которую мы недавно открыли для автоматического перевода запросов GraphQL в SQL на основе ваших определений схемы.

Ответ 5

Возможно, FB использует mongodb или nosql в backend. Недавно я прочитал запись в блоге, в которой объясняется, как подключиться к mongodb. В принципе, вам нужно построить модель графа для соответствия данным, которые у вас уже есть в вашей БД. Затем напишите решение, отклоните функцию, чтобы сообщить GQL, как вести себя при отправке запроса.

См. https://www.compose.io/articles/using-graphql-with-mongodb/

Ответ 6

Посмотрите SequelizeJS, который является ORM на основе обещаний, который может работать с несколькими диалектами; PostgreSQL, MySQL, SQLite и MSSQL

Следующий код вытягивается прямо из его примера

const Sequelize = require('sequelize');
const sequelize = new Sequelize('database', 'username', 'password', {
  host: 'localhost',
  dialect: 'mysql'|'sqlite'|'postgres'|'mssql',

  pool: {
    max: 5,
    min: 0,
    acquire: 30000,
    idle: 10000
  },

  // SQLite only
  storage: 'path/to/database.sqlite',

  // http://docs.sequelizejs.com/manual/tutorial/querying.html#operators
  operatorsAliases: false
});

const User = sequelize.define('user', {
  username: Sequelize.STRING,
  birthday: Sequelize.DATE
});

sequelize.sync()
  .then(() => User.create({
    username: 'janedoe',
    birthday: new Date(1980, 6, 20)
  }))
  .then(jane => {
    console.log(jane.toJSON());
  });