JDBC

Apps Script có thể kết nối với cơ sở dữ liệu bên ngoài thông qua dịch vụ JDBC, một trình bao bọc xung quanh công nghệ Kết nối cơ sở dữ liệu Java tiêu chuẩn. Dịch vụ JDBC hỗ trợ các cơ sở dữ liệu Google Cloud SQL cho MySQL, MySQL, Máy chủ Microsoft SQL và cơ sở dữ liệu Oracle.

Để cập nhật cơ sở dữ liệu bên ngoài bằng JDBC, tập lệnh của bạn phải mở kết nối với cơ sở dữ liệu, sau đó thực hiện các thay đổi bằng cách gửi câu lệnh SQL.

Cơ sở dữ liệu Google Cloud SQL

Google Cloud SQL cho phép bạn tạo cơ sở dữ liệu quan hệ tồn tại trên đám mây của Google. Xin lưu ý rằng Cloud SQL có thể phải chịu phí dựa trên mức sử dụng của bạn.

Bạn có thể tạo một phiên bản Google Cloud SQL bằng cách làm theo các bước nêu trong bài viết Hướng dẫn bắt đầu nhanh về Cloud SQL.

Tạo kết nối Google Cloud SQL

Có 2 cách để thiết lập kết nối với cơ sở dữ liệu Google Cloud SQL bằng dịch vụ JDBC của Apps Script:

Các phương pháp này được giải thích bên dưới. Cả hai đều hợp lệ, nhưng phương thức thứ hai yêu cầu bạn phải cho phép một tập hợp dải IP truy cập vào cơ sở dữ liệu của bạn.

Phương thức này tạo kết nối với một phiên bản MySQL của Google Cloud SQL bằng phương thức Jdbc.getCloudSqlConnection(url). URL của cơ sở dữ liệu có dạng jdbc:google:mysql://subname, trong đó subnametên kết nối thực thể MySQL được liệt kê trên trang Tổng quan về phiên bản Cloud SQL trong bảng điều khiển Google Cloud.

Để kết nối với Cloud SQL Server, hãy xem Jdbc.getConnection(url).

Sử dụng Jdbc.getConnection(url)

Để sử dụng phương thức này, bạn phải uỷ quyền một số dải địa chỉ IP Định tuyến liên miền không phân lớp (CIDR) để các máy chủ của Apps Script có thể kết nối với cơ sở dữ liệu của bạn. Trước khi chạy tập lệnh của bạn, hãy hoàn tất các bước sau:

  1. Trong phiên bản Google Cloud SQL, hãy uỷ quyền các dải IP, từng dải IP từ nguồn dữ liệu này.

  2. Sao chép URL đã được chỉ định cho cơ sở dữ liệu của bạn; URL này cần có dạng jdbc:mysql:subname.

Sau khi đã uỷ quyền các dải IP này, bạn có thể tạo kết nối với phiên bản Google Cloud SQL bằng một trong các phương thức Jdbc.getConnection(url) và URL mà bạn đã sao chép ở trên.

Cơ sở dữ liệu khác

Nếu đã có cơ sở dữ liệu MySQL, Microsoft SQL Server hoặc Oracle của riêng mình, bạn có thể kết nối với cơ sở dữ liệu đó thông qua dịch vụ JDBC của Apps Script.

Tạo các kết nối cơ sở dữ liệu khác

Để tạo kết nối cơ sở dữ liệu bằng dịch vụ JDBC của Apps Script, trong phần cài đặt cơ sở dữ liệu, bạn phải uỷ quyền cho các dải IP từ nguồn dữ liệu này.

Sau khi các danh sách cho phép này đã được thiết lập, bạn có thể tạo kết nối với cơ sở dữ liệu bằng một trong các phương thức Jdbc.getConnection(url) và URL của cơ sở dữ liệu của mình.

Mã mẫu

Mã mẫu bên dưới giả định bạn đang kết nối với một cơ sở dữ liệu Google Cloud SQL và tạo các kết nối cơ sở dữ liệu bằng phương thức Jdbc.getCloudSqlConnection(url). Đối với các cơ sở dữ liệu khác, bạn phải dùng phương thức Jdbc.getConnection(url) để tạo kết nối cơ sở dữ liệu.

Để biết thêm thông tin về phương thức JDBC, hãy xem Tài liệu của Java về JDBC.

Tạo cơ sở dữ liệu, người dùng và bảng

Hầu hết các nhà phát triển đều sử dụng công cụ dòng lệnh MySQL để tạo cơ sở dữ liệu, người dùng và bảng. Tuy nhiên, bạn cũng có thể thực hiện thao tác tương tự trong Apps Script, như minh hoạ dưới đây. Bạn nên tạo ít nhất một người dùng khác để tập lệnh của bạn không phải lúc nào cũng phải kết nối với cơ sở dữ liệu dưới dạng root.

service/jdbc.gs
/**
 * Create a new database within a Cloud SQL instance.
 */
function createDatabase() {
  try {
    const conn = Jdbc.getCloudSqlConnection(instanceUrl, root, rootPwd);
    conn.createStatement().execute('CREATE DATABASE ' + db);
  } catch (err) {
    // TODO(developer) - Handle exception from the API
    console.log('Failed with an error %s', err.message);
  }
}

/**
 * Create a new user for your database with full privileges.
 */
function createUser() {
  try {
    const conn = Jdbc.getCloudSqlConnection(dbUrl, root, rootPwd);

    const stmt = conn.prepareStatement('CREATE USER ? IDENTIFIED BY ?');
    stmt.setString(1, user);
    stmt.setString(2, userPwd);
    stmt.execute();

    conn.createStatement().execute('GRANT ALL ON `%`.* TO ' + user);
  } catch (err) {
    // TODO(developer) - Handle exception from the API
    console.log('Failed with an error %s', err.message);
  }
}

/**
 * Create a new table in the database.
 */
function createTable() {
  try {
    const conn = Jdbc.getCloudSqlConnection(dbUrl, user, userPwd);
    conn.createStatement().execute('CREATE TABLE entries ' +
      '(guestName VARCHAR(255), content VARCHAR(255), ' +
      'entryID INT NOT NULL AUTO_INCREMENT, PRIMARY KEY(entryID));');
  } catch (err) {
    // TODO(developer) - Handle exception from the API
    console.log('Failed with an error %s', err.message);
  }
}

Ghi vào cơ sở dữ liệu

Các ví dụ bên dưới minh hoạ cách ghi một bản ghi vào cơ sở dữ liệu và một lô 500 bản ghi. Việc phân lô là rất quan trọng đối với các thao tác hàng loạt.

Ngoài ra, hãy lưu ý rằng việc sử dụng câu lệnh có tham số, trong đó các biến được biểu thị bằng ?. Để ngăn các cuộc tấn công chèn SQL, bạn nên sử dụng câu lệnh có tham số để thoát mọi dữ liệu do người dùng cung cấp.

service/jdbc.gs
/**
 * Write one row of data to a table.
 */
function writeOneRecord() {
  try {
    const conn = Jdbc.getCloudSqlConnection(dbUrl, user, userPwd);

    const stmt = conn.prepareStatement('INSERT INTO entries ' +
      '(guestName, content) values (?, ?)');
    stmt.setString(1, 'First Guest');
    stmt.setString(2, 'Hello, world');
    stmt.execute();
  } catch (err) {
    // TODO(developer) - Handle exception from the API
    console.log('Failed with an error %s', err.message);
  }
}

/**
 * Write 500 rows of data to a table in a single batch.
 */
function writeManyRecords() {
  try {
    const conn = Jdbc.getCloudSqlConnection(dbUrl, user, userPwd);
    conn.setAutoCommit(false);

    const start = new Date();
    const stmt = conn.prepareStatement('INSERT INTO entries ' +
      '(guestName, content) values (?, ?)');
    for (let i = 0; i < 500; i++) {
      stmt.setString(1, 'Name ' + i);
      stmt.setString(2, 'Hello, world ' + i);
      stmt.addBatch();
    }

    const batch = stmt.executeBatch();
    conn.commit();
    conn.close();

    const end = new Date();
    console.log('Time elapsed: %sms for %s rows.', end - start, batch.length);
  } catch (err) {
    // TODO(developer) - Handle exception from the API
    console.log('Failed with an error %s', err.message);
  }
}

Đọc từ cơ sở dữ liệu

Ví dụ này minh hoạ cách đọc một số lượng lớn bản ghi từ cơ sở dữ liệu, lặp lại kết quả được đặt khi cần.

service/jdbc.gs
/**
 * Read up to 1000 rows of data from the table and log them.
 */
function readFromTable() {
  try {
    const conn = Jdbc.getCloudSqlConnection(dbUrl, user, userPwd);
    const start = new Date();
    const stmt = conn.createStatement();
    stmt.setMaxRows(1000);
    const results = stmt.executeQuery('SELECT * FROM entries');
    const numCols = results.getMetaData().getColumnCount();

    while (results.next()) {
      let rowString = '';
      for (let col = 0; col < numCols; col++) {
        rowString += results.getString(col + 1) + '\t';
      }
      console.log(rowString);
    }

    results.close();
    stmt.close();

    const end = new Date();
    console.log('Time elapsed: %sms', end - start);
  } catch (err) {
    // TODO(developer) - Handle exception from the API
    console.log('Failed with an error %s', err.message);
  }
}

Đóng kết nối

Các kết nối JDBC sẽ tự động đóng khi một tập lệnh hoàn tất quá trình thực thi. (Lưu ý rằng một lệnh gọi google.script.run duy nhất sẽ được tính là một lượt thực thi hoàn chỉnh, ngay cả khi trang dịch vụ HTML thực hiện lệnh gọi vẫn mở.)

Tuy nhiên, nếu biết bạn đã hoàn tất với một kết nối, câu lệnh hoặc kết quả được đặt trước khi kết thúc tập lệnh, bạn nên đóng các tập lệnh đó theo cách thủ công bằng cách gọi JdbcConnection.close(), JdbcStatement.close() hoặc JdbcResultSet.close().

Việc hiển thị hộp thoại cảnh báo hoặc lời nhắc cũng sẽ chấm dứt mọi kết nối JDBC đang mở. Tuy nhiên, các thành phần khác trên giao diện người dùng (như trình đơn hoặc hộp thoại tuỳ chỉnh và thanh bên có nội dung tuỳ chỉnh) thì không.

Google, Google Workspace, cũng như các nhãn hiệu và biểu trưng có liên quan là các nhãn hiệu của Google LLC. Tất cả các tên công ty và sản phẩm khác là nhãn hiệu của những công ty liên kết với những nhãn hiệu đó.