300

Apps Komut Dosyası, standart Java Database Connectivity teknolojisini kapsayan bir sarmalayıcı olan JDBC hizmeti aracılığıyla harici veritabanlarına bağlanabilir. JDBC hizmeti; MySQL için Google Cloud SQL, MySQL, Microsoft SQL Server ve Oracle veritabanlarını destekler.

JDBC ile harici bir veritabanını güncellemek için komut dosyanızın veritabanına bir bağlantı açması ve ardından SQL ifadeleri göndererek değişiklik yapması gerekir.

Google Cloud SQL veritabanları

Google Cloud SQL, Google'ın bulutunda bulunan ilişkisel veritabanları oluşturmanıza olanak tanır. Cloud SQL için kullanımınıza göre ücret alınabileceğini unutmayın.

Cloud SQL hızlı başlangıç kılavuzundaki adımları uygulayarak Google Cloud SQL örneği oluşturabilirsiniz.

Google Cloud SQL bağlantıları oluşturma

Apps Script'in JDBC hizmetini kullanarak bir Google Cloud SQL veritabanı ile bağlantı kurmak için iki yöntem vardır:

Bu yöntemler aşağıda açıklanmıştır. Her ikisi de geçerlidir ancak ikinci yöntemde veritabanınıza erişmek için bir dizi IP aralığını yetkilendirmeniz gerekir.

Bu yöntem, Jdbc.getCloudSqlConnection(url) yöntemini kullanarak bir Google Cloud SQL MySQL örneğine bağlantı oluşturur. Veritabanı URL'si jdbc:google:mysql://subname şeklindedir. Burada subname, Google Cloud Console'daki Cloud SQL örneği Genel Bakış sayfasında listelenen MySQL Örnek bağlantı adıdır.

Cloud SQL SQL Server'a bağlanmak için Jdbc.getConnection(url) bölümüne bakın.

Jdbc.getConnection(url) kullanılıyor

Bu yöntemi kullanabilmek için Apps Script sunucularının veritabanınıza bağlanabilmesi amacıyla belirli Sınıfsız Alanlar Arası Yönlendirme (CIDR) IP adresi aralıklarını yetkilendirmeniz gerekir. Komut dosyanızı çalıştırmadan önce aşağıdaki adımları tamamlayın:

  1. Google Cloud SQL örneğinizde, bu veri kaynağından IP aralıklarını tek tek yetkilendirin.

  2. Veritabanına atanan URL'yi kopyalayın. Bu URL, jdbc:mysql:subname biçiminde olmalıdır.

Bu IP aralıklarına yetki verdikten sonra, Jdbc.getConnection(url) yöntemlerinden birini ve yukarıda kopyaladığınız URL'yi kullanarak Google Cloud SQL örneğinize bağlantı oluşturabilirsiniz.

Diğer veritabanları

Kendi MySQL, Microsoft SQL Server veya Oracle veritabanınız varsa Apps Script'in JDBC hizmeti aracılığıyla veritabanınıza bağlanabilirsiniz.

Diğer veritabanı bağlantıları oluşturma

Apps Script JDBC hizmetini kullanarak veritabanı bağlantısı oluşturmak için veritabanı ayarlarınızdaki bu veri kaynağından IP aralıklarını yetkilendirmeniz gerekir.

Bu izin verilenler listeleri oluşturulduktan sonra, Jdbc.getConnection(url) yöntemlerinden birini ve veritabanınızın URL'sini kullanarak veritabanı bağlantısı oluşturabilirsiniz.

Örnek kod

Aşağıdaki örnek kodda, bir Google Cloud SQL veritabanına bağlandığınız varsayılır ve Jdbc.getCloudSqlConnection(url) yöntemi kullanılarak veritabanı bağlantıları oluşturulur. Diğer veritabanları için veritabanı bağlantıları oluşturmak üzere Jdbc.getConnection(url) yöntemini kullanmanız gerekir.

JDBC yöntemleri hakkında daha fazla bilgi için JDBC için Java belgelerine bakın.

Veritabanı, kullanıcı ve tablo oluşturma

Çoğu geliştirici, veritabanı, kullanıcı ve tablo oluşturmak için MySQL komut satırı aracını kullanır. Ancak, aşağıda gösterildiği gibi Apps Komut Dosyası'nda da aynı işlemi yapabilirsiniz. Komut dosyanızın her zaman root olarak veritabanına bağlanması gerekmemesi için en az bir başka kullanıcı oluşturmanız önerilir.

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

Veritabanına yazma

Aşağıdaki örneklerde, veritabanına tek bir kaydın yanı sıra 500 kayıtlık bir grubun nasıl yazılacağı gösterilmektedir. Toplu işlemler için gruplandırma önemlidir.

Değişkenlerin ? ile gösterildiği parametreli ifadelerin kullanımına da dikkat edin. SQL enjeksiyon saldırılarını önlemek için kullanıcı tarafından sağlanan tüm verilerden kaçmak üzere parametreli ifadeler kullanmanız gerekir.

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

Veritabanından okuma

Bu örnekte, gerektiğinde sonuç kümesi üzerinde döngü yaparak veritabanından çok sayıda kaydın nasıl okunacağı gösterilmektedir.

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

Bağlantıları kapatma

Bir komut dosyası yürütülmeyi tamamladığında JDBC bağlantıları otomatik olarak kapanır. (Çağrıyı yapan HTML hizmet sayfası açık kalsa bile tek bir google.script.run çağrısının tamamlanmış bir yürütme olarak sayıldığını unutmayın.)

Yine de komut dosyasının sona ermesinden önce bir bağlantı, ifade veya sonuç kümesiyle işinizin bittiğini biliyorsanız JdbcConnection.close(), JdbcStatement.close() veya JdbcResultSet.close()'ı çağırarak bunları manuel olarak kapatmanız önerilir.

Uyarı veya istem iletişim kutusu gösterildiğinde açık JDBC bağlantıları da sonlandırılır. Ancak özel içerik barındıran özel menüler, iletişim kutuları ve kenar çubukları gibi diğer kullanıcı arayüzü öğeleri bu kapsamda değildir.

Google, Google Workspace ve ilgili markalar ile logolar Google LLC'nin ticari markalarıdır. Diğer tüm şirket ve ürün adları, ilişkili oldukları şirketlerin ticari markalarıdır.