Đọc kỹ từ tài liệu về phương pháp truyền dữ liệu về phương pháp chuyển các giá trị sang nguyên hàm ( http://knexjs.org/#Raw ).
Nếu bạn đang chuyển các giá trị dưới dạng tham số liên kết với raw như:
knex.raw('select * from foo where id = ?', [1])
Trong trường hợp đó, các tham số và chuỗi truy vấn được chuyển riêng đến trình điều khiển cơ sở dữ liệu bảo vệ truy vấn khỏi việc đưa vào SQL.
Các phương pháp trình tạo truy vấn khác luôn sử dụng định dạng liên kết nội bộ để chúng cũng an toàn.
Để xem cách một truy vấn nhất định được chuyển đến trình điều khiển cơ sở dữ liệu, người ta có thể làm như thế nào:
knex('foo').where('id', 1).toSQL().toNative()
Điều này sẽ xuất ra chuỗi SQL và các liên kết được cấp cho trình điều khiển để chạy truy vấn ( https://runkit.com/ nhúng / 2yhqebv6pte6 ).
Sai lầm lớn nhất mà người ta có thể làm với các truy vấn thô là sử dụng chuỗi mẫu javascript và nội suy các biến trực tiếp thành định dạng chuỗi SQL như:
knex.raw(`select * from foo where id = ${id}`) // NEVER DO THIS
Một điều cần lưu ý là tên mã định danh / bảng quỳ không thể được chuyển dưới dạng ràng buộc với trình điều khiển, vì vậy với những tên đó cần hết sức cẩn thận để không đọc tên bảng / cột từ người dùng và sử dụng chúng mà không xác thực chúng trước.
Chỉnh sửa:
Bằng cách nói rằng tên mã định danh không thể được chuyển dưới dạng liên kết, ý tôi là khi một người đang sử dụng ??
quỳ -binding cho tên mã định danh, sẽ được hiển thị như một phần của chuỗi SQL khi được chuyển đến trình điều khiển cơ sở dữ liệu.