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 .

сервис/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);
  }
}

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

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

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

сервис/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);
  }
}

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

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

сервис/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);
  }
}

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

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

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

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

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