2016-10-20 2 views
0

Я новичок в узле и нуждаюсь в совете. Я пытаюсь создать реляционный SQL-запрос. Например, у меня есть таблица с именем BOOKS и другая с именем PAGES. СТРАНИЦЫ имеют внешний ключ, указывающий на строку на КНИГАХ. Я пытаюсь вернуть строку BOOK и все СТРАНИЦЫ, которые являются реляционными, а затем визуализировать представление.Реляционные вызовы в Nodejs + PostgreSQL

Я пробовал вложенные вызовы 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(); 
    }); 

И оба взрываются во время выполнения. Я пропустил что-то довольно легко?

+0

вы получаете какую-либо ошибку? – abdulbarik

+0

Ом. Вложенный пример неожиданно извинился. – andehlu

+0

Одно из решений: http://stackoverflow.com/questions/37664258/get-a-parents-children-tree-with-pg-promise –

ответ

0

Хорошо для вас, что вложенный пример работал :), но, к сожалению, это не очень хороший способ, потому что функция 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 
+0

Удивительно! Спасибо @ardilgulez – andehlu

+0

Один вопрос - это функции getColumnsFromBooksTable и getColumnsFromPagesTable, которые необходимо создать для анализа соответствующих данных? – andehlu

+0

Да. Я не знаю названий столбцов, которые у вас есть, и, следовательно, результат, поэтому я оставил их в виде заглушек. – ardilgulez

Смежные вопросы