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