Как подключить GraphQL и PostgreSQL
GraphQL имеет мутации, Postgres имеет INSERT; У GraphQL есть запросы, Postgres имеет SELECT; и т.д. и т.д. Я не нашел примера, показывающего, как вы могли бы использовать оба проекта, например, передавать все запросы из интерфейса (React, Relay) в GraphQL, но фактически хранить данные в Postgres.
Кто-нибудь знает, что Facebook использует как DB и как он связан с GraphQL?
Является единственной возможностью хранения данных в Postgres прямо сейчас для создания пользовательских "адаптеров", которые берут запрос GraphQL и преобразуют его в SQL?
Ответы
Ответ 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 на основе ваших определений схемы.
Ответ 3
Этот Graphter Starter Kit может использоваться для экспериментов с GraphQL.js и PostgreSQL:
https://github.com/kriasoft/graphql-starter-kit - Node.js, GraphQL.js, PostgreSQL, Babel, Flow
(отказ от ответственности: я автор)
Ответ 4
Посмотрите graphql-sequelize для работы с Postgres.
Для мутаций (create/update/delete) вы можете посмотреть примеры в ретрансляции ретрансляции, например.
Ответ 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());
});