2015-01-07 11 views
5

Tôi đang tạo ứng dụng Node.js cần truy vấn cơ sở dữ liệu Redshift (dựa trên postgres 8.0.2) bằng cách sử dụng CTE. Thật không may, các nhà xây dựng truy vấn SQL mà tôi đã xem xét đến nay (node-sql, knex.js và phần tiếp theo) dường như không hỗ trợ các biểu thức bảng chung (CTE).Trình tạo SQL dựa trên nút với biểu thức bảng chung (mệnh đề WITH) hỗ trợ

tôi đã thành công rực rỡ tạo thành biểu thức bảng chung trong Ruby sử dụng Jeremy Evans' viên ngọc Sequel, trong đó có một phương pháp with mà phải mất hai đối số để xác định các bảng tên aliased và tài liệu tham khảo số liệu. Tôi muốn một cái gì đó tương tự trong Node.

Tôi có bỏ lỡ bất kỳ ứng cử viên rõ ràng nào cho các nhà xây dựng truy vấn SQL Node.js không? Từ những gì tôi có thể nói đây là những bốn rõ ràng nhất:

  • nodesql
  • nodesql (không hỗ trợ postgres?)
  • knex.js
  • sequelize

Trả lời

2

tôi đã có thể để sử dụng các biểu thức bảng chung (CTE) với knex.js và nó khá dễ dàng.

Giả sử bạn đang sử dụng socket.io cùng với knex.js,

knex-example.js:

function knexExample (io, knex) { 
    io.on('connection', function (socket) { 
    var this_cte = knex('this_table').select('this_column'); 

    var that_cte = knex('that_table').select('that_column'); 

    knex.raw('with t1 as (' + this_cte + 
    '), t2 as (' + that_cte + ')' + 
    knex.select(['this', 'that']) 
     .from(['t1', 't2']) 
    ) 
    .then(function (rows) { 
     socket.emit('this_that:update', rows); 
    }); 
    }) 
} 

module.exports = knexExample; 
+0

Tôi nghĩ rằng ví dụ sẽ phá vỡ nếu có nhiều hơn một trong các truy vấn thành phần (các CTEs và trận chung kết 'knex.select () ') sử dụng các thông số ràng buộc. Thay vì sử dụng chuỗi nối, tôi khuyên bạn nên sử dụng các kết buộc 'knex.raw':' knex.raw ('với t1 là (?), T2 là (?)?', [This_cte, that_cte, knex.select (['this', 'that']) từ (['t1', 't2'])]) 'Lưu ý rằng điều này đòi hỏi knex phiên bản 0.8.0, phát hành ngày 30 tháng 4 năm 2015; Ngoài ra, nó kích hoạt tính năng "Truy vấn nguyên" của knex, có nghĩa là "phản hồi sẽ là bất kỳ thư viện sql cơ bản nào thường sẽ trả về một truy vấn bình thường". – codermonkeyfuel

+2

Ngoài ra, hãy xem [knex issue # 716] (https://github.com/tgriesser/knex/issues/716) để thực hiện hỗ trợ hạng nhất cho các CTE trong knex. – codermonkeyfuel

+1

Ghép nối các chuỗi truy vấn với nhau và sử dụng 'knex.raw' kinda đánh bại mục đích của việc sử dụng trình tạo truy vấn ngay từ đầu. –

0

Từ this issuethis issue Tôi hiểu rằng bạn có thể sử dụng CTEs với Sequelize .

Bạn cần phải sử dụng truy vấn thô và có thể chính xác loại, để đảm bảo rằng Phần tiếp theo hiểu rằng đó là truy vấn Select. Xem liên kết đầu tiên.

Mẫu mã sẽ là:

sequelize.query(
    query, //raw SQL 
    tableName, 
    {raw: true, type: Sequelize.QueryTypes.SELECT} 
).success(function (rows) { 
    // ... 
}) 

Xem here để biết chi tiết chế độ.

1

knex.js bây giờ hỗ trợ VỚI khoản:

knex.with('with_alias', (qb) => { 
    qb.select('*').from('books').where('author', 'Test') 
}).select('*').from('with_alias') 

Đầu ra:

with "with_alias" as (select * from "books" where "author" = 'Test') select * from "with_alias" 
Các vấn đề liên quan