【问题标题】:Relational calls in Nodejs + PostgreSQLNodejs + PostgreSQL 中的关系调用
【发布时间】:2016-10-20 15:59:44
【问题描述】:

我是 Node 新手,需要一些建议。我正在尝试构建一个关系 SQL 查询。例如,我有一个名为 BOOKS 的表和另一个名为 PAGES 的表。 PAGES 有一个外键指向 BOOKS 上的一行。我正在尝试返回 BOOK 行和所有相关的 PAGES,然后呈现到视图。

我尝试过嵌套的 sql 调用。下面的快速示例...

client.query('SELECT * FROM books WHERE id=($1) ',[bookid], function(err, result1) {
    client.query('SELECT * FROM pages WHERE bookid=($1) ',[bookid], function(err, result2) {

        res.render('book',{ book: result1.rows, pages: result2.rows});
        done();

    });
});

我也尝试过如下链接:

    client.query('SELECT * FROM books WHERE id=($1); SELECT * FROM pages WHERE bookid=($2) ',[bookid, bookid], function(err, result) {
        res.render('book',{ book: JSON.stringify(result.rows)});
        done();
    });

两者都在运行时爆炸。我错过了一些很容易的事情吗?

【问题讨论】:

标签: node.js postgresql


【解决方案1】:

嵌套示例工作对您有好处 :) 但不幸的是,这不是一个真正的好方法,因为 client.query 函数有很大的开销并且嵌套它而您可以侥幸逃脱不嵌套会导致问题(不是现在但肯定何时/如果您推动生产)。更好的方法是加入表格。你可以这样做:

client.query('SELECT * FROM books, pages WHERE books.bookid=($1) and books.bookid = pages.bookid ',[bookid], function(err, result) {

    var bookrows = result.map(function(item){
        getColumnsFromBooksTable(item);
    });

    var pagerows = result.map(function(item){
        getColumnsFromPagesTable(item);
    });

    res.render('book',{ book: bookrows, pages: pagerows});
    done();

});

如果您只需要每个表中的一些行而不是所有行,则可以将 client.query 与这种类型的 SQL 查询一起使用:

SELECT books.bookname, books.frontcover, books.backcover, pages.pagenumber, pages.pagecontent FROM books, pages WHERE books.bookid=($1) and books.bookid = pages.bookid

或者更好的是,如果您想使用书名(页表很可能没有的列)进行搜索:

SELECT books.bookname, books.frontcover, books.backcover, pages.pagenumber, pages.pagecontent FROM books, pages WHERE books.bookname=($1) and books.bookid = pages.bookid

【讨论】:

  • 太棒了!谢谢@ardilgulez
  • 一个问题 - 是否需要创建 getColumnsFromBooksTable 和 getColumnsFromPagesTable 函数来解析出相关数据?
  • 是的。我不知道您拥有的列名以及结果是什么,所以我将它们保留为存根。
猜你喜欢
  • 2022-01-05
  • 2021-11-16
  • 1970-01-01
  • 1970-01-01
  • 2017-02-08
  • 2018-11-27
  • 1970-01-01
  • 2020-12-06
  • 1970-01-01
相关资源
最近更新 更多