GraphQL有突变,Postgres有INSERT; GraphQL有查询,Postgres有SELECT;我没有找到一个示例,展示如何在项目中使用两者,例如在GraphQL中传递来自前端(React,Relay)的所有查询,但实际存储Postgres中的数据。
有谁知道Facebook正在使用什么作为数据库以及它与GraphQL的关联方式?
现在是在Postgres中存储数据的唯一选择是构建自定义“适配器”,它们接受GraphQL查询并将其转换为SQL吗?
答案 0 :(得分:26)
GraphQL与数据库无关,因此您可以使用通常用于与数据库交互的任何内容,并使用查询或变异的resolve
方法来调用您已定义的函数,该函数将获取/添加某些内容。数据库中。
以下是使用基于承诺的Knex SQL query builder进行突变的示例,首先没有Relay来了解该概念。我将假设您已在GraphQL架构中创建了一个userType,其中包含三个字段:id
,username
和created
:所有必填项,并且您有{{{已经定义的函数查询数据库并返回用户对象。在数据库中,我还有一个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
以适应这种情况。
使用中继的最后一个示例(getUser
,fromGlobalId
,globalIdField
和mutationWithClientMutationId
均来自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());
});