JDBC,

Apps Script może łączyć się z zewnętrznymi bazami danych za pomocą usługi JDBC w otoczce 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 działających w chmurze Google. Pamiętaj, że w zależności od wykorzystania Cloud SQL może powodować naliczanie opłat.

Możesz utworzyć instancję Google Cloud SQL, wykonując czynności opisane w krótkim wprowadzeniu do Cloud SQL.

Tworzenie połączeń Google Cloud SQL

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

Poniżej objaśniamy te metody. Obie metody są prawidłowe, ale druga metoda wymaga autoryzacji zbioru zakresów adresów IP na potrzeby dostępu do bazy danych.

Ta metoda tworzy połączenie z instancją MySQL w Google Cloud SQL przy użyciu metody Jdbc.getCloudSqlConnection(url). Adres URL bazy danych ma postać jdbc:google:mysql://subname, gdzie subname to nazwa połączenia instancji MySQL, która znajduje się na stronie Przegląd instancji Cloud SQL w konsoli Google Cloud.

Aby połączyć się z serwerem Cloud SQL SQL Server, zapoznaj się z artykułem Jdbc.getConnection(url).

przy użyciu metody Jdbc.getConnection(url),

Aby korzystać z tej metody, musisz autoryzować określone zakresy adresów IP Classless Inter-Domain Routing (CIDR), aby serwery Apps Script mogły łączyć się z Twoją bazą danych. Przed uruchomieniem skryptu wykonaj te czynności:

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

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

Po autoryzowaniu tych zakresów adresów IP możesz tworzyć połączenia ze swoją instancją Google Cloud SQL, korzystając z 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.

Po utworzeniu list dozwolonych możesz utworzyć połączenie z bazą danych przy użyciu jednej z metod Jdbc.getConnection(url) i adresu URL bazy danych.

Przykładowy kod

W przykładowym kodzie poniżej założono, że łączysz się z bazą danych Google Cloud SQL i tworzysz połączenia z bazą danych przy użyciu metody Jdbc.getCloudSqlConnection(url). W przypadku innych baz danych musisz utworzyć połączenia z użyciem metody Jdbc.getConnection(url).

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

Utwórz bazę danych, użytkownika i tabelę

Większość programistów do tworzenia baz danych, użytkowników i tabel używa narzędzia wiersza poleceń MySQL. Możesz jednak zrobić to samo w języku Apps Script, co widać poniżej. Warto utworzyć co najmniej 1 innego użytkownika, aby skrypt nie zawsze musiał łą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);
  }
}

Zapisz w bazie danych

Poniższe przykłady pokazują, jak zapisać pojedynczy rekord w bazie danych oraz grupę 500 rekordów. Grupowanie jest niezbędne w przypadku operacji zbiorczych.

Zwróć też uwagę na stosowanie instrukcji z parametrami, w których zmienne są oznaczone wartością ?. Aby zapobiec atakom wstrzykniętym SQL, używaj instrukcji z parametrami do zmiany znaczenia wszystkich danych przekazywanych przez użytkowników.

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

Odczyt z bazy danych

Ten przykład pokazuje, jak odczytywać dużą liczbę rekordów z bazy danych, zapętlając w razie potrzeby zestaw 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);
  }
}

Zamykanie połączeń

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

Jeśli jednak wiesz, że połączenie, instrukcja lub zestaw wyników zostało ukończone przed końcem skryptu, warto zamknąć je ręcznie, wywołując metodę JdbcConnection.close(), JdbcStatement.close() lub JdbcResultSet.close().

Pokazywanie okna alertu lub promptu powoduje też zamknięcie wszystkich otwartych połączeń JDBC. Jednak inne elementy interfejsu, takie jak niestandardowe menu lub okna dialogowe i paski boczne z niestandardową treścią, nie występują.

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