sql >> データベース >  >> RDS >> PostgreSQL

GraphQLとPostgreSQLを接続する方法

    GraphQLはデータベースに依存しないため、データベースとの対話に通常使用するものを使用し、クエリまたはミューテーションのresolveを使用できます。 データベースに何かを取得/追加する、定義した関数を呼び出すメソッド。

    リレーなし

    これは、promiseベースのKnex SQLクエリビルダーを使用したミューテーションの例です。最初はRelayを使用せずに、コンセプトの感触をつかんでいます。 GraphQLスキーマにidの3つのフィールドを持つuserTypeを作成したと仮定します。 、username 、およびcreated :すべてが必要であり、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では、スキーマが正しく機能するように特定の方法でスキーマを設定する必要がありますが、考え方は同じです。関数を使用して、resolveメソッドでデータベースからフェッチまたはデータベースに追加します。

    重要な注意点の1つは、Relayウェイは、オブジェクトがgetUserから返されることを想定していることです。 クラスUserのインスタンスです 、したがって、getUserを変更する必要があります それに対応するため。

    リレーを使用した最後の例(fromGlobalIdglobalIdFieldmutationWithClientMutationId 、および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),
        },
      }),
    });
    


    1. 推移閉包に使用される再帰クエリ

    2. SQLServer2008のシンボルの前の文字列内のサブ文字列を分離する

    3. Oracle Convert Seconds to Hours:Minutes:Seconds

    4. SQLServerの緊急モードからデータベースを回復する