GraphQL 和从 Oracle DB 中提取数据:查询以结果集响应并且不进入 Graphql 解析器窗口

Posted

技术标签:

【中文标题】GraphQL 和从 Oracle DB 中提取数据:查询以结果集响应并且不进入 Graphql 解析器窗口【英文标题】:GraphQL & Pulling Data from Oracle DB: Query Responds with the Resultset and Doesn't Come to The Graphql resolver Window 【发布时间】:2019-10-10 09:34:28 【问题描述】:

我是 GraphQL 的新手。

开始开发 GraphQL 应用程序以从 oracle 数据库中提取数据。

这是一个非常简单的应用程序。查询以resultset 响应,可以在console.log 中看到结果;但是,它不会出现在graphql 窗口(响应/解析器窗口)中。它抛出错误

不能为非 User.email 返回 null

我在oracle连接中尝试了promise。不确定,为什么它没有在 GraphQL 中显示数据。

UserType.js

module.exports = new GraphQLObjectType(
  name: 'User',

  fields: () => 
    return
      id:  type: GraphQLID ,
      email:  type: new GraphQLNonNull(GraphQLString) 
    
  
);

DBConnection.js

module.exports = oraPool => 
  return  
    getUsers(apiKey)
      return oracledb.createPool(oraConfig).then(function() 
    console.log("Connection Pool created");
    return oracledb.getConnection().then(function(conn) 
      return conn.execute(
        //`SELECT 'User ' || JSON_OBJECT ('id' VALUE id, 'email' VALUE email) FROM users where id = :id`
        `SELECT  * FROM users WHERE id = :id`
        ,[apiKey]).then(result => 
          //console.log(result.metaData);
          console.log(humps.camelizeKeys(result.rows[0]));
          conn.close();
          return humps.camelizeKeys(result.rows[0]);
        )
        .catch(function(err) 
          console.log(err.message);
          return connection.close();
        );
      )
      .catch(function(err) 
        console.error(err.message);
      );
    )
      
    
  

Type.js

const RootQueryType = new GraphQLObjectType(
  name: 'RootQueryType',

  fields: 
    user: 
      type: UserType,
      args: 
    key:  type: new GraphQLNonNull(GraphQLString) 
      ,
      resolve: (obj, args,  oraPool ) => 
    return oradb(oraPool).getUsers(args.key);
      

    
  
);

【问题讨论】:

请避免删除和转发问题。这通常被认为是abusive behavior。如果您不小心删除了某个问题,您可以随时取消删除。 @Daniel Rearden,我的错。我想就我的问题提供更多详细信息(*** 的新手)。也想添加更多信息 - 我的 console.log 输出类似于 [1, 'ora@11.com' ] 您可以通过编辑问题来添加信息。请不要删除和转发。 【参考方案1】:

这段代码很纠结,我建议从头开始。例如,每次运行查询时都调用createPool。您应该改为在应用初始化期间创建池。

虽然你说这将是一个简单的应用程序,但它总是可以增长的。从头开始创建 GraphQL 服务器并非易事。我建议通过 join-monster 提供一些帮助。不幸的是,join-monster 不再被积极开发。但它非常稳定,比从头开始要好得多。这是它如何工作的一个很好的概述: https://github.com/stems/join-monster/tree/master/src

我最近做了一个关于 GraphQL 的演讲,你可以在这里看到:https://www.slideshare.net/DanielMcGhan/intro-to-graphql-for-database-developers

对于演示,我采用了我在 this blog series 中描述的简单 API 模式,并将其调整为通用 EMP 和 DEPT 演示表上的 GraphQL 服务器。您可以在此处访问代码: https://www.dropbox.com/s/cnvyrlik7irtbwm/graphql-api.zip?dl=0

另外,我的另一位同事在这里谈到了 GraphQL: https://blogs.oracle.com/opal/demo:-graphql-with-node-oracledb

【讨论】:

另见blogs.oracle.com/opal/… 非常感谢丹。我是您关于 Nodejs with Oracle 博客的忠实读者。您在这里的参考帮助我清除了很多东西,现在我不再看到那个错误了。不过有一个问题,对于突变,我们有没有像 join-monster 这样的插件。 我不这么认为。不过,有了突变,编写自己的解析器可能还不错。真正困难的只是查询,因为它们可以嵌套并引用多种类型(外键),这可能导致复杂的动态 SQL。 谢谢@DanMcGhan。查询已得到解答并解决了我的所有问题。 @DanMcGhan,我正在将其用于生产。想对Join-Monster说几句。有没有办法我们可以在选择语句中使用 oracle 提示。我们如何提高连接的性能?提前致谢。如果需要,我可以提出一个新问题。

以上是关于GraphQL 和从 Oracle DB 中提取数据:查询以结果集响应并且不进入 Graphql 解析器窗口的主要内容,如果未能解决你的问题,请参考以下文章

GraphQL,如何处理连接到数百个表

科学记数法和从 DB 输出到 Python 中 JSON 的转换

“最新”标签在 ECS 任务定义和从 ECR 中提取的容器实例中如何工作?

如何编写通用 SQL 查询以与所有 RDBMS(Oracle、SQL 服务器、MySql、DB2 等等)兼容的 (YYYY-MM-DD) 形式提取日期

Oracle - ORA-01422:精确提取返回的行数超过了请求的行数

从 Java 中的 GraphQL 查询中提取查询名称及其字段