Hướng dẫn can we write sql query in javascript? - chúng ta có thể viết truy vấn sql trong javascript không?

Tôi muốn chạy một truy vấn SQL trong tệp .js. Tôi đã cố gắng thêm một số mã PHP vào nó nhưng tất nhiên nó không hoạt động.

Tôi muốn chạy truy vấn SQL:

const { Pool } = require['pg'];const conn = new Pool[{ connectionString: process.env.DATABASE_URL }];
4. Tôi muốn hiển thị giá trong biểu đồ. Có ai biết làm thế nào tôi có thể chạy truy vấn SQL này trong tệp .js để tôi có thể nhận được giá mục từ cơ sở dữ liệu không?

Tôi đang sử dụng mã JavaScript sau:

 /* Morris.js Charts */
  // Sales chart
  var area = new Morris.Area[{
    element: 'revenue-chart',
    resize: true,
    data: [
      {y: '2016 Q1', item1: 5000, item2: 4460},
      {y: '2016 Q2', item1: 8432, item2: 5713}
    ],
    xkey: 'y',
    ykeys: ['item1', 'item2'],
    labels: ['Item 1', 'Item 2'],
    lineColors: ['#a0d0e0', '#3c8dbc'],
    hideHover: 'auto'
  }];
  var line = new Morris.Line[{
    element: 'line-chart',
    resize: true,
    data: [
      {y: '2015 Q4', item1: 0},
      {y: '2016 Q1', item1: 5000},
      {y: '2016 Q2', item1: 8432}
    ],
    xkey: 'y',
    ykeys: ['item1'],
    labels: ['Item 1'],
    lineColors: ['#efefef'],
    lineWidth: 2,
    hideHover: 'auto',
    gridTextColor: "#fff",
    gridStrokeWidth: 0.4,
    pointSize: 4,
    pointStrokeColors: ["#efefef"],
    gridLineColor: "#efefef",
    gridTextFamily: "Open Sans",
    gridTextSize: 10
  }];

Hình ảnh được sử dụng theo giấy phép từ Shutterstock.com

Nếu bạn đang phát triển các ứng dụng web, bạn gần như chắc chắn sẽ liên tục tương tác với cơ sở dữ liệu. Và khi đến lúc chọn cách bạn tương tác, các lựa chọn có thể quá sức.

Trong bài viết này, chúng tôi sẽ xem xét chi tiết theo 5 cách khác nhau để tương tác với cơ sở dữ liệu của bạn bằng JavaScript và chúng tôi sẽ nói về những ưu và nhược điểm của từng người. Chúng tôi sẽ bắt đầu với sự lựa chọn cấp thấp nhất-các lệnh SQL-sau đó chuyển qua các trừu tượng cấp cao hơn.

Chọn thư viện cơ sở dữ liệu phù hợp cho ứng dụng JavaScript của bạn có thể có tác động lớn đến khả năng duy trì, khả năng mở rộng và hiệu suất mã của bạn, vì vậy, nó đáng để dành một chút thời gian để tìm ra các tùy chọn của bạn.

Ứng dụng mẫu của chúng tôi

Chúng tôi sẽ sử dụng một ứng dụng Express tầm thường được lưu trữ trên Heroku làm ví dụ của chúng tôi. Tất cả các mã cho bài viết này là trong kho GitHub này. Hãy thoải mái sao chép nó và làm theo.

Pre-requisites

Để chạy ứng dụng mẫu, bạn sẽ cần phần mềm sau trên máy của bạn:

  • Môi trường đầu cuối giống như UNIX [Mac OSX và Linux vẫn ổn. Nếu bạn sử dụng Windows, bạn sẽ cần hệ thống con Windows cho Linux].
  • Git [và một tài khoản GitHub].
  • NPM [phiên bản 6 trở lên].
  • Công cụ dòng lệnh Heroku.

Nếu bạn không có tài khoản Heroku, bạn sẽ cần phải đăng ký tài khoản miễn phí. Nếu bạn không muốn đăng ký Heroku, bạn cũng có thể chạy ứng dụng cục bộ so với một trường hợp Postgres địa phương. Nếu bạn thoải mái với điều đó, sẽ khá dễ dàng để thấy những thay đổi bạn cần thực hiện thay vì triển khai đến Heroku.

Khi bạn đã cài đặt tất cả các bên trên, hãy chạy

const { Pool } = require['pg'];const conn = new Pool[{ connectionString: process.env.DATABASE_URL }];
5 trong một thiết bị đầu cuối và bạn đã sẵn sàng để bắt đầu.

Xây dựng và triển khai ứng dụng Hello World

Để bắt đầu, chúng tôi sẽ thiết lập những điều sau:

  • Một ứng dụng Express tầm thường chỉ phục vụ một trang web Hello Hello, World World.
  • Một cơ sở dữ liệu Postgres.
  • Hai bảng, đại diện cho người dùng trên mạng và nhận xét của người dùng và người dùng [một người dùng có nhiều nhận xét].
  • Một số dữ liệu mẫu [trong trường hợp này, được tạo qua mockaroo.com].

Tôi đã tạo một ứng dụng mẫu sẽ thiết lập tất cả điều này cho bạn [miễn là bạn đã chạy

const { Pool } = require['pg'];const conn = new Pool[{ connectionString: process.env.DATABASE_URL }];
5 như đã đề cập ở trên]. Để thiết lập nó, vui lòng thực hiện các lệnh sau từ dòng lệnh:

const { Pool } = require['pg'];const conn = new Pool[{ connectionString: process.env.DATABASE_URL }];
7

const { Pool } = require['pg'];const conn = new Pool[{ connectionString: process.env.DATABASE_URL }];
8

Điều này sẽ mất một vài phút để hoàn thành. Trong khi bạn đang chờ đợi, bạn có thể xem Makefile để xem các lệnh có liên quan, thực hiện những điều sau đây:

  • Tạo một ứng dụng Heroku mới.
  • Thêm một thể hiện cơ sở dữ liệu Postgres.
  • Triển khai ứng dụng cho Heroku.
  • Chạy một lệnh trên Heroku để thiết lập các bảng cơ sở dữ liệu và nhập dữ liệu mẫu CSV.
  • Mở URL của ứng dụng Heroku của bạn trong cửa sổ trình duyệt mới.

Vào cuối quá trình này, bạn sẽ thấy Hello Hello, thế giới trên một trang web.

Tìm nạp dữ liệu bằng SQL

OK - chúng tôi đã thiết lập tất cả! Chúng tôi đã tạo ra một cơ sở dữ liệu với hai bảng và một số dữ liệu mẫu. Nhưng chúng tôi chưa làm gì với nó. Bước tiếp theo là cho phép ứng dụng web của chúng tôi truy xuất dữ liệu từ cơ sở dữ liệu.

Bất cứ khi nào bạn tương tác với cơ sở dữ liệu quan hệ, bạn sẽ làm như vậy bằng cách gửi các lệnh SQL đến ổ cắm mạng mà cơ sở dữ liệu đang nghe. Điều này đúng với tất cả các thư viện mà chúng tôi sẽ xem xét trong bài viết này - ở cấp độ thấp nhất, tất cả chúng đều gửi các lệnh SQL đến cơ sở dữ liệu và truy xuất bất kỳ đầu ra nào trở lại.

Vì vậy, cách đầu tiên chúng tôi sẽ xem xét tương tác với cơ sở dữ liệu của chúng tôi là làm điều đó - gửi các lệnh SQL. Để làm điều này, chúng tôi sẽ cài đặt thư viện PG JavaScript, cho phép chúng tôi gửi SQL đến cơ sở dữ liệu Postgres và truy xuất kết quả.

Để cài đặt thư viện PG, thực hiện lệnh sau:

const { Pool } = require['pg'];const conn = new Pool[{ connectionString: process.env.DATABASE_URL }];
9

Điều này sẽ tìm nạp và cài đặt thư viện, và nó sẽ thêm nó vào các tệp pack.json và pack-lock.json của bạn. Hãy để Lừa cam kết những thay đổi đó:

async function listUsers[req, res] {try {const db = await conn.connect[]const result = await db.query['SELECT * FROM users'];const results = { users: [result] ? result.rows : null};res.render['pages/index', results ];db.release[];} catch [err] {console.error[err];res.send["Error " + err];}}
0

async function listUsers[req, res] {try {const db = await conn.connect[]const result = await db.query['SELECT * FROM users'];const results = { users: [result] ? result.rows : null};res.render['pages/index', results ];db.release[];} catch [err] {console.error[err];res.send["Error " + err];}}
1

Để nói chuyện với cơ sở dữ liệu của chúng tôi, chúng tôi cần một số chi tiết:

  • Tên máy chủ của máy Postgres đang chạy.
  • Các cổng Postgres mạng đang lắng nghe.
  • Tên của cơ sở dữ liệu Dữ liệu của chúng tôi đang ở.
  • Tên người dùng và mật khẩu có quyền truy cập dữ liệu đó.

Hầu hết các thư viện cơ sở dữ liệu sẽ cho phép chúng tôi thiết lập kết nối bằng cách cung cấp một đối tượng cho thư viện có khóa và giá trị cho tất cả các chi tiết đó hoặc bằng cách kết hợp tất cả chúng vào một URL cơ sở dữ liệu duy nhất, đó là những gì chúng tôi sẽ làm .

Khi bạn thêm cơ sở dữ liệu vào ứng dụng Heroku, bạn sẽ tự động nhận một biến môi trường có tên là DataBase_URL, chứa tất cả các chi tiết bạn cần kết nối với cơ sở dữ liệu. Bạn có thể thấy giá trị của cơ sở dữ liệu của bạn_url bằng cách chạy:

async function listUsers[req, res] {try {const db = await conn.connect[]const result = await db.query['SELECT * FROM users'];const results = { users: [result] ? result.rows : null};res.render['pages/index', results ];db.release[];} catch [err] {console.error[err];res.send["Error " + err];}}
2

Điều này sẽ xuất ra tất cả các biến môi trường mà ứng dụng của bạn có thể sử dụng. Chỉ nên có một cái cho bây giờ, vì vậy bạn nên thấy một cái gì đó như thế này trong đầu ra:

Cơ sở dữ liệu_url:

async function listUsers[req, res] {try {const db = await conn.connect[]const result = await db.query['SELECT * FROM users'];const results = { users: [result] ? result.rows : null};res.render['pages/index', results ];db.release[];} catch [err] {console.error[err];res.send["Error " + err];}}
3
async function listUsers[req, res] {try {const db = await conn.connect[]const result = await db.query['SELECT * FROM users'];const results = { users: [result] ? result.rows : null};res.render['pages/index', results ];db.release[];} catch [err] {console.error[err];res.send["Error " + err];}}
4
async function listUsers[req, res] {try {const db = await conn.connect[]const result = await db.query['SELECT * FROM users'];const results = { users: [result] ? result.rows : null};res.render['pages/index', results ];db.release[];} catch [err] {console.error[err];res.send["Error " + err];}}
4

Trong trường hợp ví dụ của chúng tôi, điều đó bị phá vỡ như thế này:

SQL

{"hostname": "ec2-52-73-247-67.compute-1.amazonaws.com",
"port": 5432,

"database": "dfb3aad8c026in",
"username": "clqcouauvejtvw","password": "1b079cad50f3ff9b48948f15a7fa52123bc6795b875348d66886407a266c0f5b"}

Giá trị cơ sở dữ liệu của bạn_URL sẽ khác nhau, nhưng cấu trúc sẽ giống nhau.

Bây giờ chúng tôi đã cài đặt thư viện PG và chúng tôi biết cách kết nối với cơ sở dữ liệu của chúng tôi, hãy để thực hiện ví dụ đầu tiên về tương tác với cơ sở dữ liệu. Chúng tôi chỉ cần tìm nạp danh sách người dùng và hiển thị chúng trên trang web của chúng tôi. Ở đầu tệp index.js của chúng tôi, chúng tôi sẽ yêu cầu thư viện PG của chúng tôi và tạo đối tượng kết nối cơ sở dữ liệu.

JavaScript

const { Pool } = require['pg'];const conn = new Pool[{ connectionString: process.env.DATABASE_URL }];

Trong khối

async function listUsers[req, res] {try {const db = await conn.connect[]const result = await db.query['SELECT * FROM users'];const results = { users: [result] ? result.rows : null};res.render['pages/index', results ];db.release[];} catch [err] {console.error[err];res.send["Error " + err];}}
5, chúng tôi sẽ thay đổi dòng Get để gọi một phương thức hiển thị danh sách người dùng từ cơ sở dữ liệu:

async function listUsers[req, res] {try {const db = await conn.connect[]const result = await db.query['SELECT * FROM users'];const results = { users: [result] ? result.rows : null};res.render['pages/index', results ];db.release[];} catch [err] {console.error[err];res.send["Error " + err];}}
6

Cuối cùng, chúng tôi sẽ thực hiện chức năng Listusers:

JavaScript

async function listUsers[req, res] {try {const db = await conn.connect[]const result = await db.query['SELECT * FROM users'];const results = { users: [result] ? result.rows : null};res.render['pages/index', results ];db.release[];} catch [err] {console.error[err];res.send["Error " + err];}}

Mã này đợi cho đến khi kết nối được thiết lập cho cơ sở dữ liệu của chúng tôi, sau đó gửi truy vấn SQL bằng hàm truy vấn và lấy kết quả.

Bây giờ, bước này có thể thất bại vì nhiều lý do khác nhau, vì vậy trong mã, chúng tôi kiểm tra để đảm bảo chúng tôi đã có một số dữ liệu và nếu chúng tôi thực hiện, chúng tôi gán kết quả. Hãy gửi cho người dùng chính của đối tượng kết quả của chúng tôi. Tiếp theo, chúng tôi chuyển kết quả cho chức năng kết xuất, sau đó phát hành kết nối cơ sở dữ liệu của chúng tôi.

Trong chế độ xem/trang/index.ejs, chúng tôi có quyền truy cập vào đối tượng kết quả, vì vậy chúng tôi có thể hiển thị dữ liệu người dùng của mình như thế này:

HTML

Users

    { %>
  • -

Bạn có thể thấy mã với những thay đổi này ở đây.

async function listUsers[req, res] {try {const db = await conn.connect[]const result = await db.query['SELECT * FROM users'];const results = { users: [result] ? result.rows : null};res.render['pages/index', results ];db.release[];} catch [err] {console.error[err];res.send["Error " + err];}}
7 và
async function listUsers[req, res] {try {const db = await conn.connect[]const result = await db.query['SELECT * FROM users'];const results = { users: [result] ? result.rows : null};res.render['pages/index', results ];db.release[];} catch [err] {console.error[err];res.send["Error " + err];}}
8 là tên của hai cột từ bảng người dùng trong cơ sở dữ liệu của chúng tôi.

Hãy để triển khai các thay đổi này để chúng ta có thể thấy dữ liệu trong ứng dụng Heroku của chúng tôi:

async function listUsers[req, res] {try {const db = await conn.connect[]const result = await db.query['SELECT * FROM users'];const results = { users: [result] ? result.rows : null};res.render['pages/index', results ];db.release[];} catch [err] {console.error[err];res.send["Error " + err];}}
9

Users

    { %>
  • -
0

Users

    { %>
  • -
1

Điều này sẽ mất một hoặc hai phút để triển khai. Khi lệnh đó đã thực hiện xong, hãy tải lại trình duyệt của bạn và bạn sẽ thấy một danh sách người dùng trên trang web.

Ví dụ mysql

Ví dụ trên là dành cho Postgres, nhưng mã cho các cơ sở dữ liệu quan hệ phổ biến khác sẽ tương tự nhau. Ví dụ: nếu bạn đang sử dụng MySQL:

  • Thay vì
    const { Pool } = require['pg'];const conn = new Pool[{ connectionString: process.env.DATABASE_URL }];
    9 sử dụng

    Users

      { %>
    • -
    3 [sử dụng MySQL2, không phải MySQL - MySQL2 nhanh hơn và hỗ trợ Async/Await]
  • Trong index.js, bạn sẽ yêu cầu mysql như thế này:

Users

    { %>
  • -
4

  • Chức năng Listusers sẽ trông như thế này:

JavaScript

async function listUsers[req, res] {try {const conn = await mysql.createConnection[process.env.DATABASE_URL];const [rows, fields] = await conn.execute['SELECT * FROM users'];const results = { 'users': rows };res.render['pages/index', results ];await conn.end[];} catch [err] {console.error[err];res.send["Error " + err];}}

Lượt xem/trang/index.ejs vẫn giữ nguyên.

Bạn có thể thấy dự án mẫu với những thay đổi này ở đây.

Bây giờ, hãy để kiểm tra một vài thư viện được xây dựng trên nền tảng này, thêm các lớp trừu tượng cho phép bạn đọc và thao tác dữ liệu cơ sở dữ liệu theo cách giống như JavaScript giống như JavaScript.

Cho đến nay, chúng tôi đã thấy cách gửi SQL RAW đến cơ sở dữ liệu; Các tuyên bố như:

Users

    { %>
  • -
5

Nếu chúng tôi muốn nhận được nhận xét của một người dùng cụ thể, hãy nói người dùng có ID là 1, chúng tôi có thể sử dụng một cái gì đó như thế này:

Users

    { %>
  • -
6

Không có gì sai khi tương tác với cơ sở dữ liệu của bạn theo cách này, nhưng nó có thể cảm thấy hơi cồng kềnh, và nó đòi hỏi bạn phải tiếp tục thay đổi bánh răng. Bạn nghĩ về mã JavaScript của mình theo một cách, nhưng khi bạn cần suy nghĩ về dữ liệu trong cơ sở dữ liệu của mình, bạn phải bắt đầu suy nghĩ trong SQL.

Mục đích của phần còn lại của các thư viện cơ sở dữ liệu mà chúng tôi sẽ xem xét là cho phép bạn xử lý dữ liệu trong cơ sở dữ liệu của mình giống như các đối tượng và mã JavaScript trong ứng dụng của bạn. Ngay dưới mui xe, đó là tất cả các SQL, nhưng bạn đã thắng cần phải quan tâm nhiều đến điều đó trừ khi bạn muốn.

Knex - Tóm tắt SQL

Thư viện đầu tiên mà chúng tôi sẽ nói là Knex. Trang tài liệu mô tả Knex là một người xây dựng truy vấn trực tuyến, và mục đích của nó là cung cấp một lớp trừu tượng trên đầu SQL RAW.

Cài đặt Knex

Knex yêu cầu PG [hoặc MySQL nếu bạn sử dụng cơ sở dữ liệu MySQL]. Chúng tôi đã cài đặt PG, vì vậy chúng tôi chỉ cần thêm Knex như thế này:

Users

    { %>
  • -
7

Users

    { %>
  • -
8

Users

    { %>
  • -
9

Sử dụng Knex

Trang NPM cho KNEX mô tả nó như một người xây dựng truy vấn của người Viking. Knex tóm tắt SQL ở một mức độ nhất định, nhưng không xa lắm. Chúng ta vẫn cần hiểu SQL cơ bản, nhưng chúng ta có thể viết nó trong một cú pháp giống như JavaScript hơn, thay vì phải cắt và xúc xắc SQL. Quan trọng hơn, chúng ta có thể sử dụng thành phần để chuỗi các thuật ngữ KNEX theo cách thoải mái hơn nhiều cho các lập trình viên JavaScript.

Vì vậy, khi chúng tôi sử dụng PG, chúng tôi đã có tuyên bố này:

async function listUsers[req, res] {try {const conn = await mysql.createConnection[process.env.DATABASE_URL];const [rows, fields] = await conn.execute['SELECT * FROM users'];const results = { 'users': rows };res.render['pages/index', results ];await conn.end[];} catch [err] {console.error[err];res.send["Error " + err];}}
0

Khi chúng ta sử dụng KNEX, chúng ta có thể viết điều này:

async function listUsers[req, res] {try {const conn = await mysql.createConnection[process.env.DATABASE_URL];const [rows, fields] = await conn.execute['SELECT * FROM users'];const results = { 'users': rows };res.render['pages/index', results ];await conn.end[];} catch [err] {console.error[err];res.send["Error " + err];}}
1

Điều đó có thể không giống như một sự khác biệt, nhưng vì cách chúng ta có thể soạn các cuộc gọi chức năng KNEX, chúng ta cũng có thể làm những việc như thế này:

async function listUsers[req, res] {try {const conn = await mysql.createConnection[process.env.DATABASE_URL];const [rows, fields] = await conn.execute['SELECT * FROM users'];const results = { 'users': rows };res.render['pages/index', results ];await conn.end[];} catch [err] {console.error[err];res.send["Error " + err];}}
2

Tại đây, chúng tôi nhận được 5 hồ sơ người dùng, bắt đầu ở vị trí 8 trong tổng số tất cả các bản ghi người dùng có thể phù hợp với truy vấn của chúng tôi. Bạn có thể thấy toàn bộ các tùy chọn có sẵn trong tài liệu KNEX.

Hãy để thay đổi ứng dụng Express của chúng tôi để sử dụng KNEX để hiển thị một số bản ghi từ cơ sở dữ liệu của chúng tôi. Đầu tiên, trong index.js thay thế hai dòng sau:

JavaScript

const { Pool } = require['pg'];
const conn = new Pool[{ connectionString: process.env.DATABASE_URL }];

…Với cái này:

JavaScript

const db = require['knex'][{
client: 'pg',
connection: process.env.DATABASE_URL
}];

Sau đó, thay đổi việc thực hiện

async function listUsers[req, res] {try {const conn = await mysql.createConnection[process.env.DATABASE_URL];const [rows, fields] = await conn.execute['SELECT * FROM users'];const results = { 'users': rows };res.render['pages/index', results ];await conn.end[];} catch [err] {console.error[err];res.send["Error " + err];}}
3 thành điều này:

JavaScript

async function listUsers[req, res] {
try {
const result = await db.select[].from['users'].limit[5].offset[5];
const results = { 'users': [result] ? result : null};
res.render['pages/index', results ];
} catch [err] {
console.error[err];
res.send["Error " + err];
}
}

Tệp/trang/trang của chúng tôi/index.ejs có thể giữ chính xác giống như trước đây.

Cam kết, đẩy và triển khai:

async function listUsers[req, res] {try {const conn = await mysql.createConnection[process.env.DATABASE_URL];const [rows, fields] = await conn.execute['SELECT * FROM users'];const results = { 'users': rows };res.render['pages/index', results ];await conn.end[];} catch [err] {console.error[err];res.send["Error " + err];}}
4

async function listUsers[req, res] {try {const conn = await mysql.createConnection[process.env.DATABASE_URL];const [rows, fields] = await conn.execute['SELECT * FROM users'];const results = { 'users': rows };res.render['pages/index', results ];await conn.end[];} catch [err] {console.error[err];res.send["Error " + err];}}
5

Users

    { %>
  • -
1

Khi bạn làm mới trình duyệt của mình, bạn sẽ thấy bản ghi người dùng 6 đến 10 trên trang.

Bạn có thể thấy mã với những thay đổi này ở đây.

Ánh xạ quan hệ đối tượng [ORM]

Knex cung cấp cho chúng tôi một cách tương tác với cơ sở dữ liệu của chúng tôi, giống như JavaScript, nhưng chúng tôi vẫn được yêu cầu phải suy nghĩ theo cách tập trung vào cơ sở dữ liệu khi chúng tôi cần thao tác dữ liệu.

Ba thư viện tiếp theo mà chúng tôi sẽ nói đến đều được xây dựng trên đỉnh Knex [được xây dựng trên đỉnh của PG hoặc MySQL] và là những ví dụ về các thư viện Lập bản đồ đối tượng của đối tượng hoặc các thư viện ORM. Như tên gọi, mục đích của thư viện ORM là dịch giữa dữ liệu trong cơ sở dữ liệu quan hệ và các đối tượng JavaScript trong ứng dụng của bạn. Điều đó có nghĩa là, thay vì nghĩ về các bản ghi trong bảng người dùng khi bạn viết mã JavaScript của mình, bạn có thể nghĩ về các đối tượng người dùng.users table when you write your JavaScript code, you can think about user objects.

Sự phản đối

Thư viện đầu tiên mà chúng tôi sẽ xem xét là sự phản đối, được xây dựng trên đỉnh Knex:

async function listUsers[req, res] {try {const conn = await mysql.createConnection[process.env.DATABASE_URL];const [rows, fields] = await conn.execute['SELECT * FROM users'];const results = { 'users': rows };res.render['pages/index', results ];await conn.end[];} catch [err] {console.error[err];res.send["Error " + err];}}
7

Users

    { %>
  • -
8

async function listUsers[req, res] {try {const conn = await mysql.createConnection[process.env.DATABASE_URL];const [rows, fields] = await conn.execute['SELECT * FROM users'];const results = { 'users': rows };res.render['pages/index', results ];await conn.end[];} catch [err] {console.error[err];res.send["Error " + err];}}
9

Để làm nổi bật một số tiện ích của các thư viện ORM, chúng tôi sẽ thay đổi ứng dụng của mình để hiển thị người dùng và nhận xét của họ. Sự phản đối được xây dựng trên đầu của Knex, vì vậy trong tệp index.js của chúng tôi, chúng tôi phải để khối Knex tại chỗ và thêm một chút mã [tôi sẽ đặt mọi thứ vào tệp index.js, để giữ cho mọi thứ đơn giản. Trong một ứng dụng thực, bạn sẽ chia mã thành các tệp riêng biệt]:

const { Pool } = require['pg'];
const conn = new Pool[{ connectionString: process.env.DATABASE_URL }];
0

const { Pool } = require['pg'];
const conn = new Pool[{ connectionString: process.env.DATABASE_URL }];
1

Điều này cung cấp cho chúng tôi một lớp mô hình mà từ đó chúng tôi có thể kế thừa để xác định hai lớp người dùng và nhận xét. Chúng tôi sẽ xác định bình luận trước:

JavaScript

class Comment extends Model {static get tableName[] {
return 'comments';
}
}

Lớp của chúng tôi cần mở rộng

const { Pool } = require['pg'];
const conn = new Pool[{ connectionString: process.env.DATABASE_URL }];
2 và phải thực hiện hàm
const { Pool } = require['pg'];
const conn = new Pool[{ connectionString: process.env.DATABASE_URL }];
3 để cho biết sự phản đối bảng cơ sở dữ liệu nào chứa các bản ghi cơ bản.

Lớp

const { Pool } = require['pg'];
const conn = new Pool[{ connectionString: process.env.DATABASE_URL }];
4 là tương tự, nhưng chúng tôi sẽ thêm một số hành vi vào lớp của chúng tôi; một hàm
const { Pool } = require['pg'];
const conn = new Pool[{ connectionString: process.env.DATABASE_URL }];
5, mà chúng ta có thể sử dụng trong mẫu xem của mình. Chúng tôi cũng sẽ nói phản đối rằng
const { Pool } = require['pg'];
const conn = new Pool[{ connectionString: process.env.DATABASE_URL }];
6 có
const { Pool } = require['pg'];
const conn = new Pool[{ connectionString: process.env.DATABASE_URL }];
7 [tức là người dùng sở hữu số không hoặc nhiều nhận xét]. Trong ORM -speak, điều này thường được mô tả là "có nhiều mối quan hệ" - tức là người dùng có nhiều nhận xét. Đây là mã cho điều này trông như thế nào:

JavaScript

{"hostname": "ec2-52-73-247-67.compute-1.amazonaws.com",
"port": 5432,

"database": "dfb3aad8c026in",
"username": "clqcouauvejtvw","password": "1b079cad50f3ff9b48948f15a7fa52123bc6795b875348d66886407a266c0f5b"}
0

Lớp của chúng tôi cần mở rộng

const { Pool } = require['pg'];
const conn = new Pool[{ connectionString: process.env.DATABASE_URL }];
2 và phải thực hiện hàm
const { Pool } = require['pg'];
const conn = new Pool[{ connectionString: process.env.DATABASE_URL }];
3 để cho biết sự phản đối bảng cơ sở dữ liệu nào chứa các bản ghi cơ bản.

Lớp

const { Pool } = require['pg'];
const conn = new Pool[{ connectionString: process.env.DATABASE_URL }];
4 là tương tự, nhưng chúng tôi sẽ thêm một số hành vi vào lớp của chúng tôi; một hàm
const { Pool } = require['pg'];
const conn = new Pool[{ connectionString: process.env.DATABASE_URL }];
5, mà chúng ta có thể sử dụng trong mẫu xem của mình. Chúng tôi cũng sẽ nói phản đối rằng
const { Pool } = require['pg'];
const conn = new Pool[{ connectionString: process.env.DATABASE_URL }];
6 có
const { Pool } = require['pg'];
const conn = new Pool[{ connectionString: process.env.DATABASE_URL }];
7 [tức là người dùng sở hữu số không hoặc nhiều nhận xét]. Trong ORM -speak, điều này thường được mô tả là "có nhiều mối quan hệ" - tức là người dùng có nhiều nhận xét. Đây là mã cho điều này trông như thế nào:

JavaScript

{"hostname": "ec2-52-73-247-67.compute-1.amazonaws.com",
"port": 5432,

"database": "dfb3aad8c026in",
"username": "clqcouauvejtvw","password": "1b079cad50f3ff9b48948f15a7fa52123bc6795b875348d66886407a266c0f5b"}
1

Lớp của chúng tôi cần mở rộng

const { Pool } = require['pg'];
const conn = new Pool[{ connectionString: process.env.DATABASE_URL }];
2 và phải thực hiện hàm
const { Pool } = require['pg'];
const conn = new Pool[{ connectionString: process.env.DATABASE_URL }];
3 để cho biết sự phản đối bảng cơ sở dữ liệu nào chứa các bản ghi cơ bản.

Lớp

const { Pool } = require['pg'];
const conn = new Pool[{ connectionString: process.env.DATABASE_URL }];
4 là tương tự, nhưng chúng tôi sẽ thêm một số hành vi vào lớp của chúng tôi; một hàm
const { Pool } = require['pg'];
const conn = new Pool[{ connectionString: process.env.DATABASE_URL }];
5, mà chúng ta có thể sử dụng trong mẫu xem của mình. Chúng tôi cũng sẽ nói phản đối rằng
const { Pool } = require['pg'];
const conn = new Pool[{ connectionString: process.env.DATABASE_URL }];
6 có
const { Pool } = require['pg'];
const conn = new Pool[{ connectionString: process.env.DATABASE_URL }];
7 [tức là người dùng sở hữu số không hoặc nhiều nhận xét]. Trong ORM -speak, điều này thường được mô tả là "có nhiều mối quan hệ" - tức là người dùng có nhiều nhận xét. Đây là mã cho điều này trông như thế nào:

{"hostname": "ec2-52-73-247-67.compute-1.amazonaws.com",
"port": 5432,

"database": "dfb3aad8c026in",
"username": "clqcouauvejtvw","password": "1b079cad50f3ff9b48948f15a7fa52123bc6795b875348d66886407a266c0f5b"}
2

Chúng tôi xác định một đối tượng

const { Pool } = require['pg'];
const conn = new Pool[{ connectionString: process.env.DATABASE_URL }];
8 bên trong lớp
const { Pool } = require['pg'];
const conn = new Pool[{ connectionString: process.env.DATABASE_URL }];
4 của chúng tôi, với một khóa nhận xét duy nhất và giá trị phản đối rằng đây là
const db = require['knex'][{
client: 'pg',
connection: process.env.DATABASE_URL
}];
0 trên lớp
const db = require['knex'][{
client: 'pg',
connection: process.env.DATABASE_URL
}];
1, trong đó giá trị của cột ID của bảng người dùng phù hợp với giá trị của cột user_id của cột của cột user_id của Các ý kiến ​​bảng.

async function listUsers[req, res] {try {const db = await conn.connect[]const result = await db.query['SELECT * FROM users'];const results = { users: [result] ? result.rows : null};res.render['pages/index', results ];db.release[];} catch [err] {console.error[err];res.send["Error " + err];}}
9

const db = require['knex'][{
client: 'pg',
connection: process.env.DATABASE_URL
}];
4

Users

    { %>
  • -
1

Bây giờ chúng tôi đã xác định các lớp học của chúng tôi, hãy để sử dụng chúng trong mã của chúng tôi. Tại đây, việc triển khai mới của

async function listUsers[req, res] {try {const conn = await mysql.createConnection[process.env.DATABASE_URL];const [rows, fields] = await conn.execute['SELECT * FROM users'];const results = { 'users': rows };res.render['pages/index', results ];await conn.end[];} catch [err] {console.error[err];res.send["Error " + err];}}
3:

Ở đây, chúng tôi tìm nạp 5 người dùng, sau đó cho mỗi người dùng đó, chúng tôi tìm nạp nhận xét của họ và gán những người đó vào thuộc tính nhận xét của đối tượng người dùng của chúng tôi. Trong chế độ xem/trang/index.ejs, chúng tôi có thể hiển thị người dùng và nhận xét của họ như sau:

HTML

Bạn có thể thấy mã với những thay đổi này ở đây. Như thường lệ, cam kết và thúc đẩy triển khai:

JavaScript

{"hostname": "ec2-52-73-247-67.compute-1.amazonaws.com",
"port": 5432,

"database": "dfb3aad8c026in",
"username": "clqcouauvejtvw","password": "1b079cad50f3ff9b48948f15a7fa52123bc6795b875348d66886407a266c0f5b"}
3

Lớp của chúng tôi cần mở rộng

const { Pool } = require['pg'];
const conn = new Pool[{ connectionString: process.env.DATABASE_URL }];
2 và phải thực hiện hàm
const { Pool } = require['pg'];
const conn = new Pool[{ connectionString: process.env.DATABASE_URL }];
3 để cho biết sự phản đối bảng cơ sở dữ liệu nào chứa các bản ghi cơ bản.

Lớp

const { Pool } = require['pg'];
const conn = new Pool[{ connectionString: process.env.DATABASE_URL }];
4 là tương tự, nhưng chúng tôi sẽ thêm một số hành vi vào lớp của chúng tôi; một hàm
const { Pool } = require['pg'];
const conn = new Pool[{ connectionString: process.env.DATABASE_URL }];
5, mà chúng ta có thể sử dụng trong mẫu xem của mình. Chúng tôi cũng sẽ nói phản đối rằng
const { Pool } = require['pg'];
const conn = new Pool[{ connectionString: process.env.DATABASE_URL }];
6 có
const { Pool } = require['pg'];
const conn = new Pool[{ connectionString: process.env.DATABASE_URL }];
7 [tức là người dùng sở hữu số không hoặc nhiều nhận xét]. Trong ORM -speak, điều này thường được mô tả là "có nhiều mối quan hệ" - tức là người dùng có nhiều nhận xét. Đây là mã cho điều này trông như thế nào:

Chúng tôi xác định một đối tượng

const { Pool } = require['pg'];
const conn = new Pool[{ connectionString: process.env.DATABASE_URL }];
8 bên trong lớp
const { Pool } = require['pg'];
const conn = new Pool[{ connectionString: process.env.DATABASE_URL }];
4 của chúng tôi, với một khóa nhận xét duy nhất và giá trị phản đối rằng đây là
const db = require['knex'][{
client: 'pg',
connection: process.env.DATABASE_URL
}];
0 trên lớp
const db = require['knex'][{
client: 'pg',
connection: process.env.DATABASE_URL
}];
1, trong đó giá trị của cột ID của bảng người dùng phù hợp với giá trị của cột user_id của cột của cột user_id của Các ý kiến ​​bảng.

Bây giờ chúng tôi đã xác định các lớp học của chúng tôi, hãy để sử dụng chúng trong mã của chúng tôi. Tại đây, việc triển khai mới của

async function listUsers[req, res] {try {const conn = await mysql.createConnection[process.env.DATABASE_URL];const [rows, fields] = await conn.execute['SELECT * FROM users'];const results = { 'users': rows };res.render['pages/index', results ];await conn.end[];} catch [err] {console.error[err];res.send["Error " + err];}}
3:

const db = require['knex'][{
client: 'pg',
connection: process.env.DATABASE_URL
}];
6

Ở đây, chúng tôi tìm nạp 5 người dùng, sau đó cho mỗi người dùng đó, chúng tôi tìm nạp nhận xét của họ và gán những người đó vào thuộc tính nhận xét của đối tượng người dùng của chúng tôi. Trong chế độ xem/trang/index.ejs, chúng tôi có thể hiển thị người dùng và nhận xét của họ như sau:

HTML

Bạn có thể thấy mã với những thay đổi này ở đây. Như thường lệ, cam kết và thúc đẩy triển khai:

Bây giờ, khi bạn tải lại trang, bạn sẽ thấy người dùng và nhận xét.

"N+1 chọn vấn đề"

Mã này nêu bật một vấn đề phổ biến mà mọi người gặp phải khi sử dụng các thư viện ORM, được gọi là vấn đề của N+1 chọn.

const db = require['knex'][{
client: 'pg',
connection: process.env.DATABASE_URL
}];
7

const db = require['knex'][{
client: 'pg',
connection: process.env.DATABASE_URL
}];
8

const db = require['knex'][{
client: 'pg',
connection: process.env.DATABASE_URL
}];
9

async function listUsers[req, res] {
try {
const result = await db.select[].from['users'].limit[5].offset[5];
const results = { 'users': [result] ? result : null};
res.render['pages/index', results ];
} catch [err] {
console.error[err];
res.send["Error " + err];
}
}
0

Đây là khối mã chúng tôi đã sử dụng để tìm nạp người dùng và nhận xét của họ:

JavaScript

{"hostname": "ec2-52-73-247-67.compute-1.amazonaws.com",
"port": 5432,

"database": "dfb3aad8c026in",
"username": "clqcouauvejtvw","password": "1b079cad50f3ff9b48948f15a7fa52123bc6795b875348d66886407a266c0f5b"}
4

Lớp của chúng tôi cần mở rộng

const { Pool } = require['pg'];
const conn = new Pool[{ connectionString: process.env.DATABASE_URL }];
2 và phải thực hiện hàm
const { Pool } = require['pg'];
const conn = new Pool[{ connectionString: process.env.DATABASE_URL }];
3 để cho biết sự phản đối bảng cơ sở dữ liệu nào chứa các bản ghi cơ bản.

JavaScript

{"hostname": "ec2-52-73-247-67.compute-1.amazonaws.com",
"port": 5432,

"database": "dfb3aad8c026in",
"username": "clqcouauvejtvw","password": "1b079cad50f3ff9b48948f15a7fa52123bc6795b875348d66886407a266c0f5b"}
5

Lớp của chúng tôi cần mở rộng

const { Pool } = require['pg'];
const conn = new Pool[{ connectionString: process.env.DATABASE_URL }];
2 và phải thực hiện hàm
const { Pool } = require['pg'];
const conn = new Pool[{ connectionString: process.env.DATABASE_URL }];
3 để cho biết sự phản đối bảng cơ sở dữ liệu nào chứa các bản ghi cơ bản.

Lớp

const { Pool } = require['pg'];
const conn = new Pool[{ connectionString: process.env.DATABASE_URL }];
4 là tương tự, nhưng chúng tôi sẽ thêm một số hành vi vào lớp của chúng tôi; một hàm
const { Pool } = require['pg'];
const conn = new Pool[{ connectionString: process.env.DATABASE_URL }];
5, mà chúng ta có thể sử dụng trong mẫu xem của mình. Chúng tôi cũng sẽ nói phản đối rằng
const { Pool } = require['pg'];
const conn = new Pool[{ connectionString: process.env.DATABASE_URL }];
6 có
const { Pool } = require['pg'];
const conn = new Pool[{ connectionString: process.env.DATABASE_URL }];
7 [tức là người dùng sở hữu số không hoặc nhiều nhận xét]. Trong ORM -speak, điều này thường được mô tả là "có nhiều mối quan hệ" - tức là người dùng có nhiều nhận xét. Đây là mã cho điều này trông như thế nào:

{"hostname": "ec2-52-73-247-67.compute-1.amazonaws.com",
"port": 5432,

"database": "dfb3aad8c026in",
"username": "clqcouauvejtvw","password": "1b079cad50f3ff9b48948f15a7fa52123bc6795b875348d66886407a266c0f5b"}
6

Chúng tôi xác định một đối tượng

const { Pool } = require['pg'];
const conn = new Pool[{ connectionString: process.env.DATABASE_URL }];
8 bên trong lớp
const { Pool } = require['pg'];
const conn = new Pool[{ connectionString: process.env.DATABASE_URL }];
4 của chúng tôi, với một khóa nhận xét duy nhất và giá trị phản đối rằng đây là
const db = require['knex'][{
client: 'pg',
connection: process.env.DATABASE_URL
}];
0 trên lớp
const db = require['knex'][{
client: 'pg',
connection: process.env.DATABASE_URL
}];
1, trong đó giá trị của cột ID của bảng người dùng phù hợp với giá trị của cột user_id của cột của cột user_id của Các ý kiến ​​bảng.

JavaScript

{"hostname": "ec2-52-73-247-67.compute-1.amazonaws.com",
"port": 5432,

"database": "dfb3aad8c026in",
"username": "clqcouauvejtvw","password": "1b079cad50f3ff9b48948f15a7fa52123bc6795b875348d66886407a266c0f5b"}
7

Lớp của chúng tôi cần mở rộng

const { Pool } = require['pg'];
const conn = new Pool[{ connectionString: process.env.DATABASE_URL }];
2 và phải thực hiện hàm
const { Pool } = require['pg'];
const conn = new Pool[{ connectionString: process.env.DATABASE_URL }];
3 để cho biết sự phản đối bảng cơ sở dữ liệu nào chứa các bản ghi cơ bản.

Mã trong chế độ xem/trang/index.ejs gần như giống hệt nhau [Tôi đã xóa hàm fullName khỏi lớp người dùng]:

HTML

{"hostname": "ec2-52-73-247-67.compute-1.amazonaws.com",
"port": 5432,

"database": "dfb3aad8c026in",
"username": "clqcouauvejtvw","password": "1b079cad50f3ff9b48948f15a7fa52123bc6795b875348d66886407a266c0f5b"}
8

Bạn có thể thấy mã với những thay đổi này ở đây. Và tất nhiên, một lần nữa cam kết và triển khai.

async function listUsers[req, res] {try {const db = await conn.connect[]const result = await db.query['SELECT * FROM users'];const results = { users: [result] ? result.rows : null};res.render['pages/index', results ];db.release[];} catch [err] {console.error[err];res.send["Error " + err];}}
9

async function listUsers[req, res] {
try {
const result = await db.select[].from['users'].limit[5].offset[5];
const results = { 'users': [result] ? result : null};
res.render['pages/index', results ];
} catch [err] {
console.error[err];
res.send["Error " + err];
}
}
3

Users

    { %>
  • -
1

Phần tiếp theo

Thư viện cuối cùng mà chúng tôi sẽ xem xét là phần tiếp theo.

Phần tiếp theo khá quan tâm theo cách nó mong đợi dữ liệu của bạn được cấu trúc. Nếu bạn tuân theo các quy ước của nó, bạn có thể viết ít mã hơn và cho phép phần tiếp theo thực hiện nhiều công việc cho bạn. Cụ thể, phần tiếp theo có rất nhiều tính năng để giúp tạo các bảng cho bạn và theo mặc định, nó sẽ tạo ra chúng theo cấu trúc của riêng nó và các quy ước đặt tên.

Cơ sở dữ liệu mà chúng tôi đã sử dụng được cấu trúc là chính xác theo cách tiếp theo, vì vậy chúng tôi cần thêm một chút cấu hình bổ sung để cho phép phần tiếp theo hoạt động với nó.

Cài đặt phần tiếp theo

Để xóa giá sách và cài đặt phần tiếp theo, hãy chạy các lệnh sau:

async function listUsers[req, res] {
try {
const result = await db.select[].from['users'].limit[5].offset[5];
const results = { 'users': [result] ? result : null};
res.render['pages/index', results ];
} catch [err] {
console.error[err];
res.send["Error " + err];
}
}
5

async function listUsers[req, res] {
try {
const result = await db.select[].from['users'].limit[5].offset[5];
const results = { 'users': [result] ? result : null};
res.render['pages/index', results ];
} catch [err] {
console.error[err];
res.send["Error " + err];
}
}
6

Users

    { %>
  • -
8

async function listUsers[req, res] {
try {
const result = await db.select[].from['users'].limit[5].offset[5];
const results = { 'users': [result] ? result : null};
res.render['pages/index', results ];
} catch [err] {
console.error[err];
res.send["Error " + err];
}
}
8

Sử dụng phần tiếp theo

Trong index.js, thay thế các dòng sau:

JavaScript

{"hostname": "ec2-52-73-247-67.compute-1.amazonaws.com",
"port": 5432,

"database": "dfb3aad8c026in",
"username": "clqcouauvejtvw","password": "1b079cad50f3ff9b48948f15a7fa52123bc6795b875348d66886407a266c0f5b"}
9

… Với những điều này:

JavaScript

const { Pool } = require['pg'];const conn = new Pool[{ connectionString: process.env.DATABASE_URL }];
0

… Với những điều này:

JavaScript

const { Pool } = require['pg'];const conn = new Pool[{ connectionString: process.env.DATABASE_URL }];
1

… Với những điều này:

Sau đó, thay thế các định nghĩa lớp cho người dùng và nhận xét bằng mã này:

Lưu ý rằng chúng tôi đã chuyển hai đối tượng cho

async function listUsers[req, res] {
try {
const result = await db.select[].from['users'].limit[5].offset[5];
const results = { 'users': [result] ? result : null};
res.render['pages/index', results ];
} catch [err] {
console.error[err];
res.send["Error " + err];
}
}
9. Đối tượng đầu tiên xác định các thuộc tính của đối tượng của chúng tôi và thứ hai chứa một số siêu dữ liệu.

Trong trường hợp này, chúng tôi đã nói với phần tiếp theo rằng bảng cơ sở dữ liệu củng cố lớp người dùng được gọi là 'người dùng' [theo mặc định, phần tiếp theo sẽ suy ra rằng bảng được gọi là 'người dùng'] và ____90 nói với phần tiếp theo rằng bảng của chúng tôi không có dấu thời gian Các cột, được gọi là Createdat và Updatedat.

Phần tiếp theo giúp bạn rất dễ dàng ghi mã sẽ tạo các bảng cho bạn và khi nó làm như vậy, nó sẽ thêm các cột dấu thời gian này và đặt các giá trị của chúng phù hợp khi bạn ghi vào cơ sở dữ liệu. Các tài liệu tiếp theo là tuyệt vời, và có nhiều hơn về điều này.

JavaScript

const { Pool } = require['pg'];const conn = new Pool[{ connectionString: process.env.DATABASE_URL }];
2

… Với những điều này:

JavaScript

const { Pool } = require['pg'];const conn = new Pool[{ connectionString: process.env.DATABASE_URL }];
3

… Với những điều này:

class Comment extends Model {static get tableName[] {
return 'comments';
}
}
3

Sau đó, thay thế các định nghĩa lớp cho người dùng và nhận xét bằng mã này:

class Comment extends Model {static get tableName[] {
return 'comments';
}
}
4

Lưu ý rằng chúng tôi đã chuyển hai đối tượng cho

async function listUsers[req, res] {
try {
const result = await db.select[].from['users'].limit[5].offset[5];
const results = { 'users': [result] ? result : null};
res.render['pages/index', results ];
} catch [err] {
console.error[err];
res.send["Error " + err];
}
}
9. Đối tượng đầu tiên xác định các thuộc tính của đối tượng của chúng tôi và thứ hai chứa một số siêu dữ liệu.

async function listUsers[req, res] {try {const db = await conn.connect[]const result = await db.query['SELECT * FROM users'];const results = { users: [result] ? result.rows : null};res.render['pages/index', results ];db.release[];} catch [err] {console.error[err];res.send["Error " + err];}}
9

class Comment extends Model {static get tableName[] {
return 'comments';
}
}
6

Users

    { %>
  • -
1

Trong trường hợp này, chúng tôi đã nói với phần tiếp theo rằng bảng cơ sở dữ liệu củng cố lớp người dùng được gọi là 'người dùng' [theo mặc định, phần tiếp theo sẽ suy ra rằng bảng được gọi là 'người dùng'] và ____90 nói với phần tiếp theo rằng bảng của chúng tôi không có dấu thời gian Các cột, được gọi là Createdat và Updatedat.

Phần tiếp theo giúp bạn rất dễ dàng ghi mã sẽ tạo các bảng cho bạn và khi nó làm như vậy, nó sẽ thêm các cột dấu thời gian này và đặt các giá trị của chúng phù hợp khi bạn ghi vào cơ sở dữ liệu. Các tài liệu tiếp theo là tuyệt vời, và có nhiều hơn về điều này.

class Comment extends Model {static get tableName[] {
return 'comments';
}
}
1 mà chúng tôi chuyển đến Hasmany là một trong những nơi mà chúng tôi phải nói phần tiếp theo Chúng tôi không tuân theo các quy ước của nó. Nó mong đợi [và sẽ tạo cho chúng tôi] một cột có tên UserID để liên kết nhận xét với người dùng.

Bên trong chức năng

async function listUsers[req, res] {try {const conn = await mysql.createConnection[process.env.DATABASE_URL];const [rows, fields] = await conn.execute['SELECT * FROM users'];const results = { 'users': rows };res.render['pages/index', results ];await conn.end[];} catch [err] {console.error[err];res.send["Error " + err];}}
3 của chúng tôi, chúng tôi có thể thay thế tất cả các mã này:

… Với dòng duy nhất này:

Chúng tôi cũng phải thực hiện một thay đổi nhỏ trong chế độ xem/trang/index.ejs. Thay thế dòng này:

  • Với điều này [sự khác biệt là người dùng.com thay vì người dùng.com]:
  • Bạn có thể thấy mã với những thay đổi này ở đây.
  • Một vấn đề liên quan là tuổi của thư viện. Nếu nó đã tồn tại trong một thời gian, thì nhiều khả năng các vấn đề phổ biến đã được tìm thấy và khắc phục. Nếu nó là một thư viện tương đối mới, bạn có thể phải tìm ra nhiều thứ hơn cho chính mình [đó có thể là một điều tốt nếu bạn là người thích chơi với đồ chơi mới, sáng bóng và giải các câu đố].
  • Hiệu suất có nhiều khả năng phụ thuộc vào cách bạn sử dụng thư viện hơn là trên chính thư viện. Nhưng, nếu bạn hoàn toàn, tích cực phải ép vài micro giây cuối cùng ra khỏi ứng dụng của bạn, sau đó làm việc gần hơn với cơ sở dữ liệu bằng SQL hoặc KNEX sẽ nhanh hơn một chút. Được cảnh báo rằng đây thường là một lợi ích cận biên và chi phí cho khả năng duy trì mã của bạn rất có thể cao hơn mức tăng trong hiệu suất điểm chuẩn.

Hạnh phúc truy vấn!

Chúng ta có thể chạy truy vấn SQL trong JavaScript không?

Trường hợp sử dụng điển hình để thực thi SQL từ JavaScript là cập nhật trạng thái thực thi vào thời gian chạy trong luồng lồng phức hoặc để lưu các bản ghi bị từ chối bởi xác thực vào bảng lỗi. Ví dụ dưới đây cho thấy cách thực hiện SQL từ JavaScript.

Bạn có thể viết SQL bằng HTML không?

Bạn có thể sản xuất HTML từ SQL vì SQL Server có hỗ trợ tích hợp để xuất XML và HTML được hiểu rõ nhất là một phương ngữ hơi kỳ lạ của XML truyền đạt ý nghĩa cho các thẻ được xác định trước. Có rất nhiều trường hợp cạnh trong đó một cấu trúc HTML là cách rõ ràng nhất để truyền đạt các bảng, danh sách và thư mục. because SQL Server has built-in support for outputting XML, and HTML is best understood as a slightly odd dialect of XML that imparts meaning to predefined tags. There are plenty of edge cases where an HTML structure is the most obvious way of communicating tables, lists and directories.

SQL hay JavaScript nào là tốt nhất?

JavaScript là một ngôn ngữ lập trình đầy đủ mà sau đó được tận dụng để giúp bạn viết mã phía máy chủ.SQL, là nơi bạn học cách làm việc với cơ sở dữ liệu.Thực tế đây là một loại kiến thức về back-end. SQL on the other hand, is where you learn how to work with a database. Practically this is a “back-end” sort of knowledge.

JavaScript có thể đọc cơ sở dữ liệu không?

Nó thực sự phụ thuộc vào cách bạn sẽ sử dụng JavaScript.JavaScript không phải là ngôn ngữ phía máy khách nữa, Node.JS là một ví dụ trong đó JavaScript được sử dụng cho lập trình phía máy chủ và nó thực sự có kết nối cơ sở dữ liệu.Nó rất hiệu quả và được tối ưu hóa cho lập trình phía máy chủ.it actually has database connectivity as well. It is very efficient and optimized for server side programming.

Bài Viết Liên Quan

Chủ Đề