如何连接GraphQL和PostgreSQL

如何连接GraphQL和PostgreSQL,postgresql,graphql,Postgresql,Graphql,GraphQL有突变,Postgres有插入;GraphQL有查询,Postgres有SELECT;等等等等。。我还没有找到一个例子来说明如何在项目中使用这两种方法,例如在GraphQL中从前端(React,Relay)传递所有查询,但将数据实际存储在Postgres中 有人知道Facebook使用什么作为DB,以及它是如何与GraphQL连接的吗 是目前在Postgres中存储数据以构建自定义“适配器”的唯一选项,该适配器接受GraphQL查询并将其转换为SQL?了解如何使用Postgres

GraphQL有突变,Postgres有插入;GraphQL有查询,Postgres有SELECT;等等等等。。我还没有找到一个例子来说明如何在项目中使用这两种方法,例如在GraphQL中从前端(React,Relay)传递所有查询,但将数据实际存储在Postgres中

有人知道Facebook使用什么作为DB,以及它是如何与GraphQL连接的吗

是目前在Postgres中存储数据以构建自定义“适配器”的唯一选项,该适配器接受GraphQL查询并将其转换为SQL?

了解如何使用Postgres


例如,对于突变(创建/更新/删除),您可以。

GraphQL与数据库无关,因此您可以使用通常用于与数据库交互的任何东西,并使用查询或突变的
resolve
方法调用您定义的函数,该函数将获取/添加到数据库中

无继电器 这里是一个使用基于承诺的变异的例子,首先没有中继来感受这个概念。我假设您已经在GraphQL模式中创建了一个userType,它有三个字段:
id
username
、和
created
:都是必需的,并且您已经定义了一个
getUser
函数来查询数据库并返回用户对象。在数据库中,我还有一个
密码
列,但由于我不想查询该列,因此我将其从
用户类型
中删除

// 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
,我计算了
创建的
时间戳,所以在我的变异查询中不需要它们

接力方式 使用
graphql relay
中的助手并贴在离我很近的地方,这对我很有帮助,因为一下子要接受的东西太多了。Relay要求您以特定的方式设置模式,以便它能够正常工作,但想法是一样的:使用函数在resolve方法中从数据库中获取或添加到数据库中

一个重要的警告是,中继方式期望从
getUser
返回的对象是类
User
的实例,因此您必须修改
getUser
,以适应这一点

最后一个使用中继的示例(
fromGlobalId
globalIdField
mutationWithClientMutationId
,以及
nodeDefinitions
都来自
图形SQL中继
):


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


请参阅

我们在最近开放的库中解决了这个问题,该库根据您的模式定义自动将GraphQL查询转换为SQL。

可用于试验GraphQL.js和PostgreSQL:

-Node.js、GraphQL.js、PostgreSQL、Babel、Flow

(免责声明:我是作者)

看看哪一种是基于承诺的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());
  });
Postgraphile是开源的

快速构建高度可定制、闪电般快速的GraphQL API

PostGraphile是一个开源工具,可帮助您快速设计和开发 提供高性能、安全、面向客户端的GraphQL API支持 主要是通过您的PostgreSQL数据库。让您的客户满意 难以置信的性能,同时保持对数据的完全控制 还有你的数据库。使用我们强大的插件系统定制每个 GraphQLAPI的方面符合您的喜好


对于addUser函数,这不是必须是异步的/等待的吗?我说的是我更喜欢的非中继方式。“中继方式”一节中的第一个链接指向一个不推荐的repo。那怎么办?@Scott看起来像neatIs,这也在构造表,或者只是在已经有了表之后查询它们——更像是PostgraphQL?只是在已经有了表之后查询它们。不同之处在于,您仍然编写自己的API层,而不是自动生成API。这个答案中的GraphQL部分在哪里?这与问题无关,只是带来了混乱……如果您希望有一个教程风格的GraphQL续集作为探索,我写了这篇小文章。
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());
  });