GraphQLには突然変異があり、PostgresにはINSERTがあります。 GraphQLにはクエリがあり、PostgresにはSELECTがあります。など。プロジェクトで両方を使用する方法を示す例は見つかりませんでした。たとえば、GraphQLでフロントエンド(React、Relay)からすべてのクエリを渡すが、Postgresで実際にデータを保存する例です。
FacebookがDBとして使用しているものとGraphQLとの接続方法を知っている人はいますか?
GraphQLクエリを取得してSQLに変換するカスタム「アダプタ」を構築するために、現在Postgresにデータを保存する唯一のオプションはありますか?
GraphQLはデータベースに依存しないため、通常使用するものはすべてデータベースとやり取りし、クエリまたは突然変異のresolve
メソッドを使用して、データベースに何かを取得/追加する定義済みの関数を呼び出します。
以下に、Promiseベースの Knex SQLクエリビルダー を使用した突然変異の例を示します。最初に、Relayを使用せずにコンセプトを把握します。 GraphQLスキーマにid
、username
、およびcreated
の3つのフィールドを持つuserTypeを作成したと仮定します。データベースを照会してユーザーオブジェクトを返す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 の近くに固執すると、一度にすべてを取り込むのが大変だったので、助けてくれました。リレーでは、適切に機能するように特定の方法でスキーマを設定する必要がありますが、考え方は同じです。関数を使用して、resolveメソッドでデータベースからフェッチまたはデータベースに追加します。
重要な注意点の1つは、Relayの方法ではgetUser
から返されるオブジェクトがクラスUser
のインスタンスであると想定しているため、それに対応するためにgetUser
を変更する必要があることです。
リレーを使用した最後の例(fromGlobalId
、globalIdField
、mutationWithClientMutationId
、およびnodeDefinitions
はすべてgraphql-relay
からのものです):
/**
* 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),
},
}),
});
この問題は、スキーマ定義に基づいてGraphQLクエリをSQLに自動的に変換するために最近オープンソース化したライブラリである Join Monster で解決します。
このGraphQLスターターキットは、GraphQL.jsおよびPostgreSQLの実験に使用できます。
https://github.com/kriasoft/graphql-starter-kit -Node.js、GraphQL.js、PostgreSQL、Babel、Flow
(免責事項:私は著者です)
Postgresでの作業方法については graphql-sequelize をご覧ください。
突然変異(作成/更新/削除)の場合は、 リレーリポジトリの例をご覧ください などです。
Postgraphile https://www.graphile.org/postgraphile/ はオープンソースです
高度にカスタマイズ可能な超高速GraphQL APIを迅速に構築
PostGraphileは、主にPostgreSQLデータベースを基盤とする、高性能で安全なクライアント向けGraphQL APIを迅速に設計および提供するためのオープンソースツールです。データとデータベースを完全に制御しながら、驚くべきパフォーマンスで顧客を喜ばせます。強力なプラグインシステムを使用して、GraphQL APIのあらゆる面を好みに合わせてカスタマイズします。