JDBC

Apps Script kann über den JDBC-Dienst, ein Wrapper für die standardmäßige Java-Datenbankkonnektivitätstechnologie, eine Verbindung zu externen Datenbanken herstellen. Der JDBC-Dienst unterstützt Google Cloud SQL for MySQL-, MySQL-, Microsoft SQL Server- und Oracle-Datenbanken.

Zum Aktualisieren einer externen Datenbank mit JDBC muss das Skript eine Verbindung zur Datenbank herstellen und dann Änderungen durch Senden von SQL-Anweisungen vornehmen.

Google Cloud SQL-Datenbanken

Mit Google Cloud SQL können Sie relationale Datenbanken in der Google-Cloud erstellen. Beachten Sie, dass für Cloud SQL je nach Nutzung Gebühren anfallen können.

Sie können eine Google Cloud SQL-Instanz erstellen, indem Sie die in der Cloud SQL-Kurzanleitung aufgeführten Schritte ausführen.

Google Cloud SQL-Verbindungen erstellen

Es gibt zwei Möglichkeiten, mit dem JDBC-Dienst von Apps Script eine Verbindung zu einer Google Cloud SQL-Datenbank herzustellen:

Diese Methoden werden im Folgenden erläutert. Beide sind gültig. Bei der zweiten Methode müssen Sie jedoch eine Reihe von IP-Bereichen für den Zugriff auf die Datenbank autorisieren.

Bei dieser Methode wird mithilfe der Methode Jdbc.getCloudSqlConnection(url) eine Verbindung zu einer MySQL-Instanz von Google Cloud SQL hergestellt. Die Datenbank-URL hat das Format jdbc:google:mysql://subname, wobei subname der Name der MySQL-Instanzverbindung ist, der in der Google Cloud Console auf der Seite Übersicht der Cloud SQL-Instanz aufgeführt ist.

Informationen zum Herstellen einer Verbindung zu Cloud SQL SQL Server finden Sie unter Jdbc.getConnection(url).

Jdbc.getConnection(url) verwenden

Um diese Methode verwenden zu können, müssen Sie bestimmte IP-Adressbereiche des Classless Inter-Domain Routing (CIDR) autorisieren, damit die Apps Script-Server eine Verbindung zu Ihrer Datenbank herstellen können. Führen Sie die folgenden Schritte aus, bevor Sie das Skript ausführen:

  1. Autorisieren Sie die IP-Bereiche in der Google Cloud SQL-Instanz einzeln aus dieser Datenquelle.

  2. Kopieren Sie die URL, die Ihrer Datenbank zugewiesen wurde. Sie sollte das Format jdbc:mysql:subname haben.

Nachdem Sie diese IP-Bereiche autorisiert haben, können Sie mit einer der Jdbc.getConnection(url)-Methoden und der oben kopierten URL Verbindungen zu Ihrer Google Cloud SQL-Instanz herstellen.

Andere Datenbanken

Wenn Sie bereits eine eigene MySQL-, Microsoft SQL Server- oder Oracle-Datenbank haben, können Sie über den JDBC-Dienst von Apps Script eine Verbindung zu ihr herstellen.

Andere Datenbankverbindungen erstellen

Damit Sie mit dem JDBC-Dienst von Apps Script eine Datenbankverbindung herstellen können, müssen Sie in den Datenbankeinstellungen IP-Bereiche aus dieser Datenquelle autorisieren.

Sobald diese Zulassungslisten vorhanden sind, können Sie mit einer der Methoden Jdbc.getConnection(url) und der URL Ihrer Datenbank eine Verbindung zur Datenbank herstellen.

Beispielcode

Im folgenden Beispielcode wird davon ausgegangen, dass Sie eine Verbindung zu einer Google Cloud SQL-Datenbank herstellen, und es werden Datenbankverbindungen mit der Methode Jdbc.getCloudSqlConnection(url) erstellt. Bei anderen Datenbanken müssen Sie die Methode Jdbc.getConnection(url) verwenden, um Datenbankverbindungen zu erstellen.

Weitere Informationen zu den JDBC-Methoden finden Sie in der Java-Dokumentation für JDBC.

Datenbank, Nutzer und Tabelle erstellen

Die meisten Entwickler verwenden das MySQL-Befehlszeilentool zum Erstellen von Datenbanken, Nutzern und Tabellen. In Apps Script können Sie denselben Vorgang jedoch ausführen (siehe unten). Es empfiehlt sich, mindestens einen weiteren Nutzer zu erstellen, damit das Skript nicht immer als root eine Verbindung zur Datenbank herstellen muss.

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

In die Datenbank schreiben

Die folgenden Beispiele zeigen, wie ein einzelner Datensatz und ein Batch mit 500 Datensätzen in die Datenbank geschrieben werden. Die Batchverarbeitung ist bei Bulk-Vorgängen unerlässlich.

Beachten Sie auch die Verwendung von parametrisierten Anweisungen, in denen die Variablen mit ? gekennzeichnet sind. Zur Vermeidung von SQL-Injection-Angriffen sollten Sie parametrisierte Anweisungen verwenden, um alle vom Nutzer bereitgestellten Daten zu maskieren.

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

Aus der Datenbank lesen

Dieses Beispiel zeigt, wie Sie eine große Anzahl von Datensätzen aus der Datenbank lesen und die Ergebnismenge nach Bedarf mit Schleifen durchlaufen.

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

Verbindungen schließen

JDBC-Verbindungen werden automatisch geschlossen, wenn die Ausführung eines Skripts abgeschlossen ist. Hinweis: Ein einzelner google.script.run-Aufruf zählt als vollständige Ausführung, auch wenn die HTML-Dienstseite, von der der Aufruf stammt, geöffnet bleibt.

Wenn Sie jedoch bereits vor dem Ende des Skripts mit einer Verbindung, Anweisung oder Ergebnismenge fertig sind, sollten Sie diese manuell schließen, indem Sie JdbcConnection.close(), JdbcStatement.close() oder JdbcResultSet.close() aufrufen.

Wenn Sie eine Warnung oder Eingabeaufforderung anzeigen, werden auch alle offenen JDBC-Verbindungen beendet. Bei anderen angezeigten UI-Elementen wie benutzerdefinierten Menüs oder Dialogfeldern und Seitenleisten mit benutzerdefinierten Inhalten ist dies jedoch nicht der Fall.

Google, Google Workspace und zugehörige Marken und Logos sind Marken von Google LLC. Alle anderen Firmen- und Produktnamen sind Marken der Unternehmen, mit denen sie verbunden sind.