Vì vậy, giả sử bạn có một mảng dữ liệu lớn và bạn muốn chèn tất cả dữ liệu này vào cơ sở dữ liệu. Thực hiện một vòng lặp for và tạo một kết nối mới cho từng phần dữ liệu đơn lẻ là cách làm không tốt và rất kém hiệu quả. Chúng ta sẽ xem xét một số cách để có thể đạt được điều này một cách dễ dàng và một số cách để làm cho quy trình trở nên mạnh mẽ hơn
Kết nối với cơ sở dữ liệu
Vì vậy, để bắt đầu, hãy tạo một kết nối mysql mới. Trước tiên, hãy đảm bảo rằng chúng tôi có các gói mô-đun nút cần thiết
- mysql
Tiếp theo hãy tiếp tục và tạo một kết nối mới. Tôi sẽ sử dụng ES6 cho các ví dụ mã
import mysql from 'mysql';
const connection = mysql.createConnection[{
host: 'localhost',
user: 'username',
password: 'super_secure_password',
database: 'database_name'
}];
connection.connect[[error] => {
if [error] {
console.error[error];
} else {
console.log['connection successful'];
}
}];
Ghi chú. bạn cần nhập các giá trị máy chủ, người dùng, mật khẩu và cơ sở dữ liệu của riêng mình
Bây giờ chúng ta có một kết nối tiêu chuẩn, hãy xem ví dụ về câu lệnh INSERT
connection.connect[[error] => {
if [error] {
console.error[error];
} else {
let query = 'INSERT INTO user [name, age, occupation] VALUES [?, ?, ?];';
let params = ['fred', 34, 'car sales'];
connection.query[query, params, [error, result] => {
// inserted row -> 1
}];
}
}];
Chỉ cần lướt qua mã một cách nhanh chóng;
- Chúng tôi tạo một kết nối mới [dòng 1]
- Viết chuỗi truy vấn của chúng tôi với liên kết tham số [dòng 5]
- Chúng tôi đặt các giá trị của mình vào một mảng [dòng 6]
- Chúng tôi chuyển chuỗi truy vấn, tham số và gọi lại cho kết nối [dòng 7]
- Dòng 8, bây giờ chúng ta có thể kiểm tra lỗi và xác thực rằng chúng ta đã thực sự chèn một bản ghi mới
Sử dụng liên kết tham số
Vì vậy, như bạn có thể đã nhận thấy ở trên, chúng tôi đã bắt đầu sử dụng liên kết tham số gốc cho gói NodeJS. Tuy nhiên, điều gì sẽ xảy ra nếu chúng tôi có 5 người dùng để chèn. Làm những gì chúng tôi đã làm ở trên, gấp 5 lần sẽ là một phương pháp rất kém hiệu quả. Chúng tôi không muốn tạo 5 kết nối mới và loại bỏ từng kết nối
Vì vậy, hãy sử dụng nhiều chức năng chèn gốc
connection.connect[[error] => {
if [error] {
console.error[error];
} else {
let query = 'INSERT INTO user [name, age, occupation] VALUES ?;';
let params = [
['fred', 34, 'car sales'],
['john', 21, 'gardner'],
['peter', 17, 'postman'],
['rob', 55, 'engineer']
];
connection.query[query, [params], [error, result] => {
// inserted rows -> 4
}];
}
}];
Vì vậy, có một số điều cần đặc biệt chú ý ở đây
- Lưu ý rằng chúng tôi không có dấu ngoặc đơn xung quanh liên kết tham số sau từ khóa sql 'GIÁ TRỊ'
- Cũng lưu ý rằng chúng ta thực sự có một mảng ba lớp lồng nhau
Xây dựng truy vấn SQL thủ công
Vậy điều gì sẽ xảy ra nếu tất cả dữ liệu của bạn không nhất quán và bạn cần thực hiện những thay đổi nhỏ đối với truy vấn khi bạn chuyển qua dữ liệu. Chà, có thể sử dụng phương thức thoát của mysql theo cách thủ công. Tôi sẽ đi vào lý do tại sao chúng ta cần làm điều này trong một bài đăng khác, nhưng đủ để nói rằng, bạn phải
connection.connect[[error] => {
if [error] {
console.error[error];
} else {
let data = [
['fred''],
['john'],
['peter'],
['rob']
];
let query = '';
for[let user of data] {
if[!user[0] !== 'fred'] {
query += 'INSERT INTO user [name] VALUES [' + mysql.escape[user[0]] + '];';
}
}
connection.query[query, [error, result] => {
// inserted rows -> 3
}];
}
}];
Sau đó, khá đơn giản, chỉ cần lặp qua dữ liệu của bạn [mảng hoặc đối tượng] và xây dựng chuỗi truy vấn của bạn tại một thời điểm. Như bạn có thể thấy, chúng tôi chỉ tạo truy vấn chèn mới nếu chỉ mục đầu tiên của dữ liệu không phải là 'fred'. Bạn có thể làm điều này phức tạp như bạn muốn để tạo ra các truy vấn năng động hơn bao giờ hết
VUI LÒNG đảm bảo rằng bạn thoát khỏi TẤT CẢ các tham số, nếu không, bạn có thể để bản thân mở rộng cho SQL Injection, điều này thật tệ
Kích thước gói tối đa
Vì vậy, tôi thực sự không gặp phải nhiều lỗi khi triển khai điều này trong một hệ thống trực tiếp, vì vậy tôi không có nhiều lời khuyên về những gì sai và tại sao;
Tôi đã cố gắng chèn hàng loạt khoảng 180.000 bản ghi từ một tệp CSV và tôi liên tục gặp lỗi. Khi tôi lần theo lỗi trở lại đầu ra của MySQL trong bảng điều khiển, tôi có thể thấy rằng máy chủ MySQL của mình đang chạy với một ‘maximum_allowed_packet’ khá nhỏ
Để kiểm tra kích thước gói hiện tại bạn đã đặt, chỉ cần chạy lệnh này và lệnh bên dưới để cập nhật biến
Ai đó có thể giúp tôi chèn nhiều hàng bằng mariadb không, đã kiểm tra trên stackoverflow mà không có giải pháp nào trong trường hợp của tôi. Tôi có thể chèn một hàng tốt, nhưng khi cần chèn 2 hàng, tôi gặp lỗi cú pháp. Tôi đã thử đặt tham số giá trị trong ngoặc nhưng không thành công
Đây là mã của tôi
const config = require['../config']; const mariadb = require['mariadb']; const pool = mariadb.createPool[{ host: config.database.host, user: config.database.user, port: config.database.port, password: config.database.password, database: config.database.database, multipleStatements: true, connectionLimit: 5 }]; app.post['/questions', [req, res] => { let values = []; for [var i = 0; i < multiAnswerId.length; i++] { values.push[new Array[quiz_id, question_id, multiAnswerId[i], multiCorrect[i], time_start, userPicks.time_stop, student_id]]; } var sql = `INSERT INTO Govt_choice_response [Quiz_id, Question_id, Answer_id, Correct, Time_start, Time_stop, Student_id] VALUES ?`; pool.query[sql, values, [err, data] => { }] .then[ rows => { if [question_id > qTotal] { res.send[` You finished the test! [Make a page later here with maybe some user data] `] } question_id ++; res.redirect['/questions']; }] .catch[err => { console.log[err]; }] }]; }
Bình luận
Nội dung được sao chép trên trang web này là tài sản của chủ sở hữu tương ứng và nội dung này không được MariaDB xem xét trước. Quan điểm, thông tin và ý kiến được thể hiện bởi nội dung này không nhất thiết đại diện cho quan điểm của MariaDB hoặc bất kỳ bên nào khác