JDBC,

Apps Script może łączyć się z zewnętrznymi bazami danych za pomocą usługi JDBC, która jest obudową standardowej technologii Java Database Connectivity. Usługa JDBC obsługuje bazy danych Google Cloud SQL for MySQL, MySQL, Microsoft SQL Server i Oracle.

Aby zaktualizować zewnętrzną bazę danych za pomocą JDBC, skrypt musi otworzyć połączenie z bazą danych, a następnie wprowadzić zmiany, wysyłając instrukcje SQL.

Bazy danych Google Cloud SQL

Google Cloud SQL umożliwia tworzenie relacyjnych baz danych w chmurze Google. Pamiętaj, że za korzystanie z usługi Cloud SQL mogą być naliczane opłaty.

Instancję Google Cloud SQL możesz utworzyć, wykonując czynności opisane w artykule Szybki start z Cloud SQL.

Tworzenie połączeń z Google Cloud SQL

Istnieją 2 sposoby nawiązywania połączenia z bazą danych Google Cloud SQL za pomocą usługi JDBC w Apps Script:

Te metody omawiamy poniżej. Obie metody są prawidłowe, ale druga wymaga autoryzacji zestawu zakresów adresów IP, aby uzyskać dostęp do bazy danych.

Ta metoda tworzy połączenie z instancją MySQL w Google Cloud SQL za pomocą metody Jdbc.getCloudSqlConnection(url). Adres URL bazy danych ma postać jdbc:google:mysql://subname, gdzie subname to nazwa połączenia z instancją MySQL podana na stronie Przegląd instancji Cloud SQL w konsoli Google Cloud.

Aby nawiązać połączenie z serwerem SQL Cloud SQL, zobacz Jdbc.getConnection(url).

Użycie metody Jdbc.getConnection(url)

Aby skorzystać z tej metody, musisz autoryzować określone zakresy adresów IP w ramach międzydomenowego routingu bez klasy (CIDR), aby serwery Apps Script mogły połączyć się z Twoją bazą danych. Zanim uruchomisz skrypt, wykonaj te czynności:

  1. W instancji Google Cloud SQL autoryzuj zakresy adresów IP, po jednym naraz z tego źródła danych.

  2. Skopiuj adres URL przypisany do Twojej bazy danych. Powinien mieć format jdbc:mysql:subname.

Po autoryzowaniu tych zakresów adresów IP możesz tworzyć połączenia z instancją Google Cloud SQL za pomocą jednej z metod Jdbc.getConnection(url) i adresu URL skopiowanego powyżej.

Inne bazy danych

Jeśli masz już własną bazę danych MySQL, Microsoft SQL Server lub Oracle, możesz się z nią połączyć za pomocą usługi JDBC w Apps Script.

Tworzenie innych połączeń z bazą danych

Aby utworzyć połączenie z bazą danych za pomocą usługi JDBC w Apps Script, w ustawieniach bazy danych musisz autoryzować zakresy adresów IP z tego źródła danych.

Gdy te listy dozwoleń będą już gotowe, możesz utworzyć połączenie z bazą danych, używając jednej z metod Jdbc.getConnection(url) i adresu URL bazy danych.

Przykładowy kod

Przykładowy kod poniżej zakłada, że łączysz się z bazą danych Google Cloud SQL i tworzy połączenia z bazami danych za pomocą metody Jdbc.getCloudSqlConnection(url). W przypadku innych baz danych musisz użyć metody Jdbc.getConnection(url) do tworzenia połączeń z bazą danych.

Więcej informacji o metodach JDBC znajdziesz w dokumentacji JDBC w języku Java.

Tworzenie bazy danych, użytkownika i tabeli

Większość programistów używa narzędzia wiersza poleceń MySQL do tworzenia baz danych, użytkowników i tabel. To samo można jednak zrobić w Apps Script, jak pokazano poniżej. Warto utworzyć co najmniej 1 innego użytkownika, aby skrypt nie musiał zawsze łączyć się z bazą danych jako 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);
  }
}

zapisywanie danych w bazie danych,

Przykłady poniżej pokazują, jak zapisać w bazie danych pojedynczy rekord oraz partię 500 rekordów. Grupowanie jest niezbędne w przypadku operacji zbiorczych.

Zwróć też uwagę na użycie instrukcji parametrycznych, w których zmienne są oznaczone symbolem ?. Aby zapobiec atakom polegającym na wstrzykiwaniu kodu SQL, używaj instrukcji parametrycznych, aby uciekać wszystkie dane podawane przez użytkownika.

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);
  }
}

odczytywanie z bazy danych,

Ten przykład pokazuje, jak odczytać dużą liczbę rekordów z bazy danych, wykonując w razie potrzeby pętlę na zbiorze wyników.

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);
  }
}

Zamknięcie połączeń

Po zakończeniu wykonywania skryptu połączenia JDBC są zamykane automatycznie. Pamiętaj, że pojedynczy wywołanie google.script.run liczy się jako pełne wykonanie, nawet jeśli strona usługi HTML, która wykonała wywołanie, pozostaje otwarta.

Jeśli jednak przed zakończeniem skryptu wiesz, że nie będziesz już używać połączenia, instrukcji ani zbioru wyników, warto je zamknąć ręcznie, wywołując funkcję JdbcConnection.close(), JdbcStatement.close() lub JdbcResultSet.close().

Wyświetlenie alertu lub okna z prośbą powoduje również zamknięcie wszystkich otwartych połączeń JDBC. Inne elementy interfejsu użytkownika, takie jak menu niestandardowe, okna dialogowe i paski boczne z niestandardowym zawartością, nie są jednak dozwolone.

​Google, Google Workspace i powiązane znaki i logotypy są znakami towarowymi Google LLC. Wszystkie inne nazwy firm i produktów są znakami towarowymi odpowiednich podmiotów.