JDBC

Apps Script может подключаться к внешним базам данных через службу JDBC , оболочку для стандартной технологии Java Database Connectivity . Служба JDBC поддерживает базы данных Google Cloud SQL для MySQL , MySQL, Microsoft SQL Server и Oracle.

Чтобы обновить внешнюю базу данных с помощью JDBC, ваш скрипт должен открыть соединение с базой данных, а затем внести изменения, отправив операторы SQL.

Базы данных Google Cloud SQL

Google Cloud SQL позволяет создавать реляционные базы данных, размещаемые в облаке Google. Обратите внимание, что за использование Cloud SQL может взиматься плата в зависимости от объема использования.

Вы можете создать экземпляр Google Cloud SQL, выполнив шаги, перечисленные в кратком руководстве по Cloud SQL .

Создание подключений Google Cloud SQL

Существует два способа установления соединения с базой данных Google Cloud SQL с помощью службы JDBC Apps Script:

Эти методы описаны ниже. Оба метода допустимы, но второй метод требует авторизации набора диапазонов IP-адресов для доступа к вашей базе данных.

Этот метод создаёт подключение к экземпляру Google Cloud SQL MySQL с помощью метода Jdbc.getCloudSqlConnection(url) . URL-адрес базы данных имеет вид jdbc:google:mysql://subname , где subname — это имя подключения к экземпляру MySQL, указанное на странице обзора экземпляра Cloud SQL в консоли Google Cloud .

Чтобы подключиться к Cloud SQL SQL Server, см. Jdbc.getConnection(url) .

Использование Jdbc.getConnection(url)

Чтобы использовать этот метод, необходимо авторизовать определённые диапазоны IP-адресов бесклассовой междоменной маршрутизации (CIDR), чтобы серверы Apps Script могли подключаться к вашей базе данных. Перед запуском скрипта выполните следующие действия:

  1. В вашем экземпляре Google Cloud SQL авторизуйте диапазоны IP-адресов по одному из этого источника данных .

  2. Скопируйте URL-адрес, назначенный вашей базе данных; он должен иметь вид jdbc:mysql:subname .

После авторизации этих диапазонов IP-адресов вы можете создавать подключения к экземпляру Google Cloud SQL, используя один из методов Jdbc.getConnection(url) и URL-адрес, скопированный выше.

Другие базы данных

Если у вас уже есть собственная база данных MySQL, Microsoft SQL Server или Oracle, вы можете подключиться к ней через службу JDBC Apps Script.

Создание других подключений к базе данных

Чтобы создать подключение к базе данных с помощью службы Apps Script JDBC , в настройках базы данных необходимо разрешить диапазоны IP-адресов из этого источника данных .

После создания этих списков разрешенных адресов вы можете создать подключение к базе данных, используя один из методов Jdbc.getConnection(url) и URL-адрес вашей базы данных.

Пример кода

В примере кода ниже предполагается, что вы подключаетесь к базе данных Google Cloud SQL и создаёте подключения к ней с помощью метода Jdbc.getCloudSqlConnection(url) . Для других баз данных необходимо использовать метод Jdbc.getConnection(url) .

Дополнительную информацию о методах JDBC см. в документации Java для JDBC .

Создать базу данных, пользователя и таблицу

Большинство разработчиков используют командную строку MySQL для создания баз данных, пользователей и таблиц. Однако то же самое можно сделать и в Apps Script, как показано ниже. Рекомендуется создать хотя бы ещё одного пользователя, чтобы вашему скрипту не приходилось всегда подключаться к базе данных как root .

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

Запись в базу данных

Примеры ниже демонстрируют, как записать в базу данных как одну запись, так и пакет из 500 записей. Пакетирование крайне важно для массовых операций.

Обратите внимание также на использование параметризованных операторов, в которых переменные обозначены символом ? . Чтобы предотвратить атаки с использованием SQL-инъекций , следует использовать параметризованные операторы для экранирования всех предоставленных пользователем данных.

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

Чтение из базы данных

В этом примере показано, как считывать большое количество записей из базы данных, при необходимости перебирая результаты.

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

Закрытие соединений

Подключения JDBC автоматически закрываются после завершения выполнения скрипта. (Имейте в виду, что один вызов google.script.run считается полным выполнением, даже если страница HTML-службы, выполнившая вызов, остается открытой.)

Тем не менее, если вы знаете, что завершили работу с соединением, оператором или набором результатов до завершения скрипта, рекомендуется закрыть их вручную, вызвав JdbcConnection.close() , JdbcStatement.close() или JdbcResultSet.close() .

Отображение оповещения или диалогового окна с подсказкой также завершает все открытые соединения JDBC. Однако другие отображаемые элементы пользовательского интерфейса, такие как пользовательские меню, диалоговые окна и боковые панели с пользовательским содержимым, остаются в этом состоянии.

Google, Google Workspace и связанные с ними знаки и логотипы являются товарными знаками Google LLC. Все остальные названия компаний и продуктов являются товарными знаками компаний, с которыми они связаны.