Thông báo quan trọng. để thực hiện các truy vấn sẵn sàng sản xuất với Phần tiếp theo, hãy đảm bảo bạn cũng đã đọc hướng dẫn về Giao dịch. Giao dịch rất quan trọng để đảm bảo tính toàn vẹn của dữ liệu và cung cấp các lợi ích khác
Hướng dẫn này sẽ chỉ ra cách thực hiện các truy vấn CRUD tiêu chuẩn
Truy vấn INSERT đơn giản
Đầu tiên, một ví dụ đơn giản
// Create a new user
const jane = await User.create({ firstName: "Jane", lastName: "Doe" });
console.log("Jane's auto-generated ID:", jane.id);
Phương thức này là cách viết tắt để xây dựng một phiên bản chưa được lưu và lưu phiên bản đó với
Cũng có thể xác định thuộc tính nào có thể được đặt trong phương thức Model.findAll({
attributes: ['foo', 'bar']
});
5. Điều này có thể đặc biệt hữu ích nếu bạn tạo các mục nhập cơ sở dữ liệu dựa trên biểu mẫu mà người dùng có thể điền vào. Ví dụ: sử dụng điều đó sẽ cho phép bạn hạn chế mô hình Model.findAll({
attributes: ['foo', 'bar']
});
6 chỉ đặt tên người dùng chứ không đặt cờ quản trị viên (tôi. e. , Model.findAll({
attributes: ['foo', 'bar']
});
7)
const user = await User.create({
username: 'alice123',
isAdmin: true
}, { fields: ['username'] });
// let's assume the default of isAdmin is false
console.log(user.username); // 'alice123'
console.log(user.isAdmin); // false
Truy vấn CHỌN đơn giản
Bạn có thể đọc toàn bộ bảng từ cơ sở dữ liệu bằng phương thức
// Find all users
const users = await User.findAll();
console.log(users.every(user => user instanceof User)); // true
console.log("All users:", JSON.stringify(users, null, 2));
SELECT * FROM ...
Chỉ định các thuộc tính cho các truy vấn CHỌN
Để chỉ chọn một số thuộc tính, bạn có thể sử dụng tùy chọn Model.findAll({
attributes: ['foo', 'bar']
});
9
Model.findAll({
attributes: ['foo', 'bar']
});
SELECT foo, bar FROM ...
Các thuộc tính có thể được đổi tên bằng cách sử dụng một mảng lồng nhau
Model.findAll({
attributes: ['foo', 'bar']
});
0
Model.findAll({
attributes: ['foo', 'bar']
});
1
Bạn có thể sử dụng để làm tập hợp
Model.findAll({
attributes: ['foo', 'bar']
});
2
Model.findAll({
attributes: ['foo', 'bar']
});
3
Khi sử dụng chức năng tổng hợp, bạn phải đặt cho nó một bí danh để có thể truy cập nó từ mô hình. Trong ví dụ trên, bạn có thể lấy số lượng mũ bằng SELECT foo, bar FROM ...
1
Đôi khi việc liệt kê tất cả các thuộc tính của mô hình có thể gây mệt mỏi nếu bạn chỉ muốn thêm một tập hợp
const user = await User.create({
username: 'alice123',
isAdmin: true
}, { fields: ['username'] });
// let's assume the default of isAdmin is false
console.log(user.username); // 'alice123'
console.log(user.isAdmin); // false
0
const user = await User.create({
username: 'alice123',
isAdmin: true
}, { fields: ['username'] });
// let's assume the default of isAdmin is false
console.log(user.username); // 'alice123'
console.log(user.isAdmin); // false
1
Tương tự, cũng có thể loại bỏ một số thuộc tính đã chọn
const user = await User.create({
username: 'alice123',
isAdmin: true
}, { fields: ['username'] });
// let's assume the default of isAdmin is false
console.log(user.username); // 'alice123'
console.log(user.isAdmin); // false
2
const user = await User.create({
username: 'alice123',
isAdmin: true
}, { fields: ['username'] });
// let's assume the default of isAdmin is false
console.log(user.username); // 'alice123'
console.log(user.isAdmin); // false
3
Áp dụng mệnh đề WHERE
Tùy chọn SELECT foo, bar FROM ...
2 được sử dụng để lọc truy vấn. Có rất nhiều toán tử để sử dụng cho mệnh đề SELECT foo, bar FROM ...
2, có sẵn dưới dạng Ký hiệu từ
Những thứ cơ bản
const user = await User.create({
username: 'alice123',
isAdmin: true
}, { fields: ['username'] });
// let's assume the default of isAdmin is false
console.log(user.username); // 'alice123'
console.log(user.isAdmin); // false
4
Quan sát rằng không có toán tử nào (từ SELECT foo, bar FROM ...
4) được thông qua một cách rõ ràng, vì vậy Sequelize mặc định mặc định so sánh đẳng thức. Đoạn mã trên tương đương với
const user = await User.create({
username: 'alice123',
isAdmin: true
}, { fields: ['username'] });
// let's assume the default of isAdmin is false
console.log(user.username); // 'alice123'
console.log(user.isAdmin); // false
5
Nhiều kiểm tra có thể được thông qua
const user = await User.create({
username: 'alice123',
isAdmin: true
}, { fields: ['username'] });
// let's assume the default of isAdmin is false
console.log(user.username); // 'alice123'
console.log(user.isAdmin); // false
6
Giống như Sequelize đã suy ra toán tử SELECT foo, bar FROM ...
6 trong ví dụ đầu tiên, ở đây Sequelize đã suy ra rằng người gọi muốn có một SELECT foo, bar FROM ...
7 cho hai lần kiểm tra. Đoạn mã trên tương đương với
const user = await User.create({
username: 'alice123',
isAdmin: true
}, { fields: ['username'] });
// let's assume the default of isAdmin is false
console.log(user.username); // 'alice123'
console.log(user.isAdmin); // false
7
Có thể dễ dàng thực hiện một SELECT foo, bar FROM ...
8 theo cách tương tự
const user = await User.create({
username: 'alice123',
isAdmin: true
}, { fields: ['username'] });
// let's assume the default of isAdmin is false
console.log(user.username); // 'alice123'
console.log(user.isAdmin); // false
8
Vì ở trên là một SELECT foo, bar FROM ...
8 liên quan đến cùng một trường, Sequelize cho phép bạn sử dụng một cấu trúc hơi khác, dễ đọc hơn và tạo ra cùng một hành vi
const user = await User.create({
username: 'alice123',
isAdmin: true
}, { fields: ['username'] });
// let's assume the default of isAdmin is false
console.log(user.username); // 'alice123'
console.log(user.isAdmin); // false
9
nhà điều hành
Sequelize cung cấp một số toán tử
// Find all users
const users = await User.findAll();
console.log(users.every(user => user instanceof User)); // true
console.log("All users:", JSON.stringify(users, null, 2));
0
Cú pháp viết tắt của Model.findAll({
attributes: ['foo', 'bar']
});
00
Truyền một mảng trực tiếp vào tùy chọn SELECT foo, bar FROM ...
2 sẽ ngầm sử dụng toán tử Model.findAll({
attributes: ['foo', 'bar']
});
02
// Find all users
const users = await User.findAll();
console.log(users.every(user => user instanceof User)); // true
console.log("All users:", JSON.stringify(users, null, 2));
1
Kết hợp logic với toán tử
Các toán tử Model.findAll({
attributes: ['foo', 'bar']
});
03, Model.findAll({
attributes: ['foo', 'bar']
});
04 và Model.findAll({
attributes: ['foo', 'bar']
});
05 có thể được sử dụng để tạo các phép so sánh logic lồng nhau phức tạp tùy ý
Ví dụ với Model.findAll({
attributes: ['foo', 'bar']
});
03 và Model.findAll({
attributes: ['foo', 'bar']
});
04
// Find all users
const users = await User.findAll();
console.log(users.every(user => user instanceof User)); // true
console.log("All users:", JSON.stringify(users, null, 2));
2
Ví dụ với Model.findAll({
attributes: ['foo', 'bar']
});
05
// Find all users
const users = await User.findAll();
console.log(users.every(user => user instanceof User)); // true
console.log("All users:", JSON.stringify(users, null, 2));
3
Ở trên sẽ tạo ra
// Find all users
const users = await User.findAll();
console.log(users.every(user => user instanceof User)); // true
console.log("All users:", JSON.stringify(users, null, 2));
4
Truy vấn nâng cao với hàm (không chỉ cột)
Điều gì sẽ xảy ra nếu bạn muốn lấy thứ gì đó như Model.findAll({
attributes: ['foo', 'bar']
});
09?
// Find all users
const users = await User.findAll();
console.log(users.every(user => user instanceof User)); // true
console.log("All users:", JSON.stringify(users, null, 2));
5
Lưu ý cách sử dụng các phương thức và, nên được sử dụng để chỉ định một lệnh gọi hàm SQL và một cột trong bảng tương ứng. Các phương pháp này nên được sử dụng thay vì chuyển một chuỗi đơn giản (chẳng hạn như Model.findAll({
attributes: ['foo', 'bar']
});
12) vì Sequelize cần xử lý tình huống này theo cách khác (ví dụ: sử dụng các phương pháp thoát ký hiệu khác)
Điều gì nếu bạn cần một cái gì đó phức tạp hơn?
// Find all users
const users = await User.findAll();
console.log(users.every(user => user instanceof User)); // true
console.log("All users:", JSON.stringify(users, null, 2));
6
Ở trên tạo ra SQL sau
// Find all users
const users = await User.findAll();
console.log(users.every(user => user instanceof User)); // true
console.log("All users:", JSON.stringify(users, null, 2));
7
Toán tử phạm vi chỉ dành cho Postgres
Các loại phạm vi có thể được truy vấn với tất cả các toán tử được hỗ trợ
Hãy ghi nhớ, giá trị phạm vi được cung cấp cũng có thể
// Find all users
const users = await User.findAll();
console.log(users.every(user => user instanceof User)); // true
console.log("All users:", JSON.stringify(users, null, 2));
8
không dùng nữa. bí danh nhà điều hành
Trong Sequelize v4, có thể chỉ định các chuỗi để chỉ các toán tử, thay vì sử dụng Ký hiệu. Điều này hiện không được dùng nữa và không được khuyến khích nhiều và có thể sẽ bị xóa trong phiên bản chính tiếp theo. Nếu bạn thực sự cần nó, bạn có thể chuyển tùy chọn Model.findAll({
attributes: ['foo', 'bar']
});
13 trong hàm tạo Sequelize
Ví dụ
// Find all users
const users = await User.findAll();
console.log(users.every(user => user instanceof User)); // true
console.log("All users:", JSON.stringify(users, null, 2));
9
Truy vấn CẬP NHẬT đơn giản
Truy vấn cập nhật cũng chấp nhận tùy chọn SELECT foo, bar FROM ...
2, giống như truy vấn đọc được hiển thị ở trên
SELECT * FROM ...
0
Các truy vấn XÓA đơn giản
Truy vấn xóa cũng chấp nhận tùy chọn SELECT foo, bar FROM ...
2, giống như truy vấn đọc được hiển thị ở trên
SELECT * FROM ...
1
Để hủy mọi thứ, có thể sử dụng SQL Model.findAll({
attributes: ['foo', 'bar']
});
16
SELECT * FROM ...
2
Tạo hàng loạt
Sequelize cung cấp phương thức Model.findAll({
attributes: ['foo', 'bar']
});
17 cho phép tạo nhiều bản ghi cùng lúc, chỉ với một truy vấn
Cách sử dụng của Model.findAll({
attributes: ['foo', 'bar']
});
17 rất giống với Model.findAll({
attributes: ['foo', 'bar']
});
19, bằng cách nhận một mảng các đối tượng thay vì một đối tượng duy nhất
SELECT * FROM ...
3
Tuy nhiên, theo mặc định, Model.findAll({
attributes: ['foo', 'bar']
});
20 không chạy xác thực trên từng đối tượng sẽ được tạo (điều mà Model.findAll({
attributes: ['foo', 'bar']
});
5 thực hiện). Để làm cho Model.findAll({
attributes: ['foo', 'bar']
});
20 cũng chạy các xác thực này, bạn phải vượt qua tùy chọn Model.findAll({
attributes: ['foo', 'bar']
});
23. Điều này sẽ làm giảm hiệu suất. Ví dụ sử dụng
SELECT * FROM ...
4
Nếu bạn đang chấp nhận các giá trị trực tiếp từ người dùng, có thể hữu ích khi giới hạn các cột mà bạn thực sự muốn chèn. Để hỗ trợ điều này, Model.findAll({
attributes: ['foo', 'bar']
});
24 chấp nhận tùy chọn Model.findAll({
attributes: ['foo', 'bar']
});
25, một mảng xác định trường nào phải được xem xét (phần còn lại sẽ bị bỏ qua)
SELECT * FROM ...
5
Đặt hàng và nhóm
Sequelize cung cấp các tùy chọn Model.findAll({
attributes: ['foo', 'bar']
});
26 và Model.findAll({
attributes: ['foo', 'bar']
});
27 để làm việc với Model.findAll({
attributes: ['foo', 'bar']
});
28 và Model.findAll({
attributes: ['foo', 'bar']
});
29
đặt hàng
Tùy chọn Model.findAll({
attributes: ['foo', 'bar']
});
26 lấy một mảng các mục để sắp xếp truy vấn theo hoặc phương thức sắp xếp lại. Bản thân các mục này là các mảng có dạng Model.findAll({
attributes: ['foo', 'bar']
});
31. Cột sẽ được thoát chính xác và hướng sẽ được kiểm tra trong danh sách trắng gồm các hướng hợp lệ (chẳng hạn như Model.findAll({
attributes: ['foo', 'bar']
});
32, Model.findAll({
attributes: ['foo', 'bar']
});
33, Model.findAll({
attributes: ['foo', 'bar']
});
34, v.v.)
SELECT * FROM ...
6
Tóm lại, các phần tử của mảng thứ tự có thể như sau
- Một chuỗi (sẽ được trích dẫn tự động)
- Một mảng, có phần tử đầu tiên sẽ được trích dẫn, phần tử thứ hai sẽ được thêm vào nguyên văn
- Một đối tượng có trường Model.findAll({
attributes: ['foo', 'bar']
});
35- Nội dung của Model.findAll({
attributes: ['foo', 'bar']
});
35 sẽ được bổ sung nguyên văn mà không trích dẫn - Mọi thứ khác bị bỏ qua và nếu raw không được đặt, truy vấn sẽ thất bại
- Nội dung của Model.findAll({
- Một lệnh gọi tới Model.findAll({
attributes: ['foo', 'bar']
});
37 (sẽ tạo ra một lệnh gọi hàm trong SQL) - Một cuộc gọi đến Model.findAll({
attributes: ['foo', 'bar']
});
38 (sẽ trích dẫn tên cột)
nhóm
Cú pháp để nhóm và sắp xếp giống nhau, ngoại trừ việc nhóm không chấp nhận hướng làm đối số cuối cùng của mảng (không có Model.findAll({
attributes: ['foo', 'bar']
});
32, Model.findAll({
attributes: ['foo', 'bar']
});
33, Model.findAll({
attributes: ['foo', 'bar']
});
34, v.v.)
Bạn cũng có thể chuyển trực tiếp một chuỗi tới Model.findAll({
attributes: ['foo', 'bar']
});
27, chuỗi này sẽ được đưa trực tiếp (nguyên văn) vào SQL được tạo. Thận trọng khi sử dụng và không sử dụng với nội dung do người dùng tạo