JDBC

Die Versionen 1.0 und 1.1 des TLS-Sicherheitsprotokolls sind deaktiviert. Verwenden Sie für Verbindungen TLS 1.2 oder höher.

Google Apps Script kann Verbindungen zu externen Datenbanken über den JDBC-Dienst herstellen. Dies ist ein Wrapper für die Standardtechnologie der Java-Datenbankkonnektivität. Der JDBC-Dienst unterstützt Google Cloud SQL for MySQL-, MySQL-, Microsoft SQL Server-, Oracle- und PostgreSQL-Datenbanken.

Wenn Ihre Tabelle zu groß wird oder bei komplexen Berechnungen Zeitüberschreitungen auftreten, kann die Übertragung Ihrer Daten in eine externe Datenbank die Leistung und Zuverlässigkeit erheblich verbessern.

Wenn Sie eine externe Datenbank mit JDBC aktualisieren möchten, muss in Ihrem Skript eine Verbindung zur Datenbank geöffnet und dann Änderungen durch Senden von SQL-Anweisungen vorgenommen werden.

Google Cloud SQL-Datenbanken

Mit Google Cloud SQL können Sie relationale Datenbanken in der Google Cloud erstellen. Für Cloud SQL können je nach Nutzung Gebühren anfallen.

Erstellen Sie eine Google Cloud SQL-Instanz, indem Sie die Schritte in der Cloud SQL-Kurzanleitung ausführen.

Google Cloud SQL-Verbindungen erstellen

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

Beide sind gültig, aber für die zweite Methode müssen Sie eine Reihe von IP-Bereichen für den Zugriff auf Ihre Datenbank autorisieren.

Mit dieser Methode wird eine Verbindung zu einer Google Cloud SQL for MySQL-Instanz mit der Methode Jdbc.getCloudSqlConnection hergestellt. Die Datenbank-URL hat das Format jdbc:google:mysql://subname, wobei subname der MySQL-Instanzverbindungsname ist, der auf der Seite Übersicht der Cloud SQL-Instanz in der Google Cloud Console aufgeführt ist.

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

Verwenden Sie Jdbc.getConnection.

Damit Sie diese Methode verwenden können, müssen Sie bestimmte CIDR-IP-Adressbereiche (Classless Inter-Domain Routing) autorisieren, damit die Server von Apps Script eine Verbindung zu Ihrer Datenbank herstellen können. Führen Sie vor dem Ausführen des Skripts die folgenden Schritte aus:

  1. Autorisieren Sie die IP-Bereiche in Ihrer 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, stellen Sie mit einer der Jdbc.getConnection-Methoden und der URL, die Sie zuvor kopiert haben, Verbindungen zu Ihrer Google Cloud SQL-Instanz her.

Andere Datenbanken

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

Andere Datenbankverbindungen erstellen

Wenn Sie eine Datenbankverbindung mit dem JDBC-Dienst von Apps Script erstellen möchten, müssen Sie in Ihren Datenbankeinstellungen IP-Bereiche aus dieser Datenquelle autorisieren.

Der JDBC-Dienst kann nur Verbindungen zu Ports ab 1025 herstellen. Achten Sie darauf, dass Ihre Datenbank nicht über einen niedrigeren Port bereitgestellt wird.

Sobald diese Zulassungslisten eingerichtet sind, können Sie mit einer der Jdbc.getConnection-Methoden 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. Datenbankverbindungen werden mit der Methode Jdbc.getCloudSqlConnection erstellt. Für andere Datenbanken müssen Sie die Methode Jdbc.getConnection 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, um Datenbanken, Nutzer und Tabellen zu erstellen. Es ist jedoch möglich, dasselbe in Apps Script zu tun, wie im folgenden Beispiel gezeigt. Erstellen Sie mindestens einen weiteren Nutzer, damit Ihr Script 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. Batching ist für Bulk-Vorgänge unerlässlich.

Es werden parametrisierte Anweisungen verwendet, in denen die Variablen mit ? angegeben werden. Um SQL-Injection-Angriffe zu verhindern, sollten Sie parametrisierte Anweisungen verwenden, um alle von Nutzern 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);
  }
}

/**
 * Write 500 rows of data to a table in a single batch.
 * Recommended for faster writes
 */
function writeManyRecordsUsingExecuteBatch() {
  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 (?, ?)",
    );
    const params = [];
    for (let i = 0; i < 500; i++) {
      params.push([`Name ${i}`, `Hello, world ${i}`]);
    }

    const batch = stmt.executeBatch(params);
    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

In diesem Beispiel wird gezeigt, wie eine große Anzahl von Datensätzen aus der Datenbank gelesen wird. Das Ergebnis-Set wird dabei nach Bedarf 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);
  }
}

/**
 * Read up to 1000 rows of data from the table and log them.
 * Recommended for faster reads
 */
function readFromTableUsingGetRows() {
  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();
    const getRowArgs = [];
    for (let col = 0; col < numCols; col++) {
      getRowArgs.push(`getString(${col + 1})`);
    }
    const rows = results.getRows(getRowArgs.join(","));
    for (let i = 0; i < rows.length; i++) {
      console.log(rows[i].join("\t"));
    }

    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. Einzelne google.script.run-Aufrufe gelten als vollständige Ausführung, auch wenn die HTML-Dienstseite, von der der Aufruf stammt, geöffnet bleibt.

Wenn Sie jedoch wissen, dass Sie eine Verbindung, Anweisung oder Ergebnismenge vor dem Ende des Skripts nicht mehr benötigen, schließen Sie sie manuell, indem Sie JdbcConnection.close, JdbcStatement.close oder JdbcResultSet.close aufrufen.

Wenn ein Warn- oder Aufforderungsdialogfeld angezeigt wird, werden auch alle offenen JDBC-Verbindungen beendet. Andere UI-Elemente, die angezeigt werden, z. B. benutzerdefinierte Menüs oder Dialogfelder und Seitenleisten mit benutzerdefinierten Inhalten, werden jedoch nicht übersetzt.

Google, Google Workspace sowie zugehörige Marken und Logos sind Marken von Google LLC. Alle anderen Unternehmens- und Produktnamen sind Marken der jeweiligen Unternehmen.