gpt4 book ai didi

postgresql - 如何连接 GraphQL 和 PostgreSQL

转载 作者:行者123 更新时间:2023-11-29 11:06:23 24 4
gpt4 key购买 nike

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

有谁知道 Facebook 将什么用作数据库以及它如何与 GraphQL 连接?

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

最佳答案

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

无中继

这是一个使用基于 promise 的 Knex SQL query builder 的突变示例,首先在没有 Relay 的情况下感受一下这个概念。我假设您已经在 GraphQL 模式中创建了一个 userType,它具有三个字段:idusernamecreated:所有需要,并且您已经定义了一个 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 中的助手并非常接近 Relay Starter Kit帮助了我,因为一次要吸收很多东西。 Relay 要求您以特定方式设置您的模式,以便它可以正常工作,但想法是相同的:使用您的函数在 resolve 方法中从数据库中获取或添加到数据库。

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

最后一个使用Relay的例子(fromGlobalIdglobalIdFieldmutationWithClientMutationIdnodeDefinitions都来自graphql 中继):

/**
* We get the node interface and field from the Relay library.
*
* The first method defines the way we resolve an ID to its object.
* The second defines the way we resolve an object to its GraphQL type.
*
* All your types will implement this nodeInterface
*/
const { nodeInterface, nodeField } = nodeDefinitions(
(globalId) => {
const { type, id } = fromGlobalId(globalId);
if (type === 'User') {
return getUser(id);
}
return null;
},
(obj) => {
if (obj instanceof User) {
return userType;
}
return null;
}
);

// a globalId is just a base64 encoding of the database id and the type
const userType = new GraphQLObjectType({
name: 'User',
description: 'A user.',
fields: () => ({
id: globalIdField('User'),
username: {
type: new GraphQLNonNull(GraphQLString),
description: 'The username the user has selected.',
},
created: {
type: GraphQLInt,
description: 'The Unix timestamp in seconds of when the user was created.',
},
}),
interfaces: [nodeInterface],
});

// The "payload" is the data that will be returned from the mutation
const userMutation = mutationWithClientMutationId({
name: 'AddUser',
inputFields: {
username: {
type: GraphQLString,
},
password: {
type: new GraphQLNonNull(GraphQLString),
},
},
outputFields: {
user: {
type: userType,
resolve: (payload) => getUser(payload.userId),
},
},
mutateAndGetPayload: ({ username, password }) =>
addUser(
{ username, password }
).then((user) => ({ userId: user.id })), // passed to resolve in outputFields
});

const mutationType = new GraphQLObjectType({
name: 'Mutation',
description: 'Functions to add things to the database.',
fields: () => ({
addUser: userMutation,
}),
});

const queryType = new GraphQLObjectType({
name: 'Query',
fields: () => ({
node: nodeField,
user: {
type: userType,
args: {
id: {
description: 'ID number of the user.',
type: new GraphQLNonNull(GraphQLID),
},
},
resolve: (root, args) => getUser(args.id),
},
}),
});

关于postgresql - 如何连接 GraphQL 和 PostgreSQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35940528/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com