如何连接GraphQL和PostgreSQL

时间:2016-03-11 12:40:20

标签: postgresql graphql

GraphQL有突变,Postgres有INSERT; GraphQL有查询,Postgres有SELECT;我没有找到一个示例,展示如何在项目中使用两者,例如在GraphQL中传递来自前端(React,Relay)的所有查询,但实际存储Postgres中的数据。

有谁知道Facebook正在使用什么作为数据库以及它与GraphQL的关联方式?

现在是在Postgres中存储数据的唯一选择是构建自定义“适配器”,它们接受GraphQL查询并将其转换为SQL吗?

7 个答案:

答案 0 :(得分:26)

GraphQL与数据库无关,因此您可以使用通常用于与数据库交互的任何内容,并使用查询或变异的resolve方法来调用您已定义的函数,该函数将获取/添加某些内容。数据库中。

没有接力

以下是使用基于承诺的Knex SQL query builder进行突变的示例,首先没有Relay来了解该概念。我将假设您已在GraphQL架构中创建了一个userType,其中包含三个字段:idusernamecreated:所有必填项,并且您有{{{已经定义的函数查询数据库并返回用户对象。在数据库中,我还有一个getUser列,但由于我不想查询,我将其从password中删除。

userType

由于Postgres为我创建// 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, }) ), }, }), }); 并且我计算了id时间戳,我在变异查询中不需要它们。

接力方式

使用created中的助手并且非常靠近Relay Starter Kit帮助了我,因为一下子就可以接受很多。 Relay要求您以特定的方式设置模式,以便它可以正常工作,但想法是相同的:使用您的函数从解析方法中获取或添加到数据库。

一个重要的警告是,Relay方式期望从graphql-relay返回的对象是类getUser的实例,因此您必须修改User以适应这种情况。

使用中继的最后一个示例(getUserfromGlobalIdglobalIdFieldmutationWithClientMutationId均来自nodeDefinitions):

graphql-relay

答案 1 :(得分:19)

我们在Join Monster中解决了这个问题,我们最近开源的库是根据您的架构定义自动将GraphQL查询转换为SQL的。

答案 2 :(得分:8)

https://github.com/kriasoft/graphql-starter-kit 可用于试验GraphQL.js和PostgreSQL:

https://docs.microsoft.com/en-us/aspnet/core/mvc/controllers/testing - Node.js,GraphQL.js,PostgreSQL,Babel,Flow

(免责声明:我是作者)

答案 3 :(得分:4)

查看graphql-sequelize有关如何使用Postgres的信息。

对于突变(创建/更新/删除),您可以look at the examples in the relay repo例如。

答案 4 :(得分:0)

Postgraphile https://www.graphile.org/postgraphile/是开源的

  

快速构建高度可定制的,快如闪电的GraphQL API

     

PostGraphile是一个开源工具,可帮助您快速设计和   提供高性能,安全,面向客户端的GraphQL API支持   主要由您的PostgreSQL数据库提供。令您的客户满意   出色的性能,同时保持对数据的完全控制   和您的数据库。使用我们强大的插件系统自定义每个   您喜欢的GraphQL API方面。

答案 5 :(得分:-3)

可能是FB在后端使用mongodb或nosql。我最近读了一篇博客文章,解释了如何连接到mongodb。基本上,您需要构建一个图模型以匹配数据库中已有的数据。然后编写resolve,reject函数告诉GQL在发布查询请求时如何表现。

请参阅https://www.compose.io/articles/using-graphql-with-mongodb/

答案 6 :(得分:-3)

查看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());
  });