JDBC

TLS सुरक्षा प्रोटोकॉल के वर्शन 1.0 और 1.1 बंद कर दिए गए हैं. कनेक्शन बनाने के लिए, TLS 1.2 या उससे ऊपर के वर्शन का इस्तेमाल करें.

Google Apps Script, JDBC सेवा की मदद से बाहरी डेटाबेस से कनेक्ट हो सकता है. यह सेवा, स्टैंडर्ड Java Database Connectivity टेक्नोलॉजी के लिए रैपर के तौर पर काम करती है. JDBC सेवा, MySQL के लिए Google Cloud SQL, MySQL, Microsoft SQL Server, Oracle, और PostgreSQL डेटाबेस के साथ काम करती है.

अगर आपकी स्प्रेडशीट बहुत बड़ी हो रही है या जटिल कैलकुलेशन में टाइम आउट की समस्याएं आ रही हैं, तो अपने डेटा को किसी बाहरी डेटाबेस में ले जाने से, परफ़ॉर्मेंस और भरोसेमंद तरीके से काम करने की क्षमता में काफ़ी सुधार हो सकता है.

JDBC की मदद से किसी बाहरी डेटाबेस को अपडेट करने के लिए, आपके स्क्रिप्ट को डेटाबेस से कनेक्शन बनाना होगा. इसके बाद, SQL स्टेटमेंट भेजकर बदलाव करने होंगे.

Google Cloud SQL डेटाबेस

Google Cloud SQL की मदद से, ऐसे रिलेशनल डेटाबेस बनाए जा सकते हैं जो Google Cloud में मौजूद होते हैं. Cloud SQL के इस्तेमाल के आधार पर, शुल्क लग सकता है.

Cloud SQL के क्विकस्टार्ट में दिए गए चरणों को पूरा करके, Google Cloud SQL इंस्टेंस बनाएं.

Google Cloud SQL कनेक्शन बनाना

Apps Script की JDBC सेवा का इस्तेमाल करके, Google Cloud SQL डेटाबेस से कनेक्शन बनाने के दो तरीके हैं:

  • (सुझाया गया) Jdbc.getCloudSqlConnection का इस्तेमाल करके कनेक्ट करना
  • Jdbc.getConnection का इस्तेमाल करके कनेक्ट करना

ये दोनों तरीके मान्य हैं. हालांकि, दूसरे तरीके के लिए, आपको अपने डेटाबेस को ऐक्सेस करने के लिए, आईपी पतों की कुछ रेंज को अनुमति देनी होगी.

इस तरीके से, Jdbc.getCloudSqlConnection तरीके का इस्तेमाल करके, Google Cloud SQL MySQL इंस्टेंस से कनेक्शन बनाया जाता है. डेटाबेस का यूआरएल, jdbc:google:mysql://subname फ़ॉर्मैट में होता है. इसमें subname Google Cloud Console में Cloud SQL इंस्टेंस के खास जानकारी पेज पर दिया गया MySQL इंस्टेंस कनेक्शन का नाम होता है.

Cloud SQL SQL Server से कनेक्ट करने के लिए, Jdbc.getConnection देखें.

Jdbc.getConnection का इस्तेमाल करना

इस तरीके का इस्तेमाल करने के लिए, आपको कुछ Classless Inter-Domain Routing (CIDR) आईपी पतों की रेंज को अनुमति देनी होगी, ताकि Apps Script के सर्वर आपके डेटाबेस से कनेक्ट हो सकें. अपना स्क्रिप्ट चलाने से पहले, यह तरीका अपनाएं:

  1. अपने Google Cloud SQL इंस्टेंस में, आईपी पतों की रेंज को अनुमति दें, इस डेटा सोर्स से एक-एक करके.

  2. अपने डेटाबेस को असाइन किया गया यूआरएल कॉपी करें. यह jdbc:mysql:subname फ़ॉर्मैट में होना चाहिए.

आईपी पतों की इन रेंज को अनुमति देने के बाद, Jdbc.getConnection के किसी एक तरीके और पहले कॉपी किए गए यूआरएल का इस्तेमाल करके, अपने Google Cloud SQL इंस्टेंस से कनेक्शन बनाएं.

अन्य डेटाबेस

अगर आपके पास पहले से ही MySQL, Microsoft SQL Server, Oracle या PostgreSQL डेटाबेस है, तो Apps Script की JDBC सेवा की मदद से उससे कनेक्ट करें.

अन्य डेटाबेस कनेक्शन बनाना

Apps Script की JDBC सेवा का इस्तेमाल करके डेटाबेस कनेक्शन बनाने के लिए, आपको अपने डेटाबेस की सेटिंग में, इस डेटा सोर्स से आईपी पतों की रेंज को अनुमति देनी होगी.

JDBC सेवा, सिर्फ़ पोर्ट 1025 या उससे बाद के पोर्ट से कनेक्ट हो सकती है. पक्का करें कि आपका डेटाबेस, इससे कम पोर्ट पर काम न कर रहा हो.

अनुमति वाली इन सूचियों को सेट अप करने के बाद, डेटाबेस से कनेक्शन बनाएं Jdbc.getConnection के किसी एक तरीके और अपने डेटाबेस के यूआरएल का इस्तेमाल करके.

नमूना कोड

इस नमूना कोड में, यह माना गया है कि आप Google Cloud SQL डेटाबेस से कनेक्ट हो रहे हैं. साथ ही, इसमें Jdbc.getCloudSqlConnection तरीके का इस्तेमाल करके डेटाबेस कनेक्शन बनाए गए हैं. अन्य डेटाबेस के लिए, आपको डेटाबेस कनेक्शन बनाने के लिए Jdbc.getConnection तरीके का इस्तेमाल करना होगा.

JDBC के तरीकों के बारे में ज़्यादा जानने के लिए, JDBC के लिए Java का दस्तावेज़ देखें.

डेटाबेस, उपयोगकर्ता, और टेबल बनाना

ज़्यादातर डेवलपर, डेटाबेस, उपयोगकर्ता, और टेबल बनाने के लिए 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);
  }
}

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

डेटाबेस से पढ़ना

इस उदाहरण में, डेटाबेस से बड़ी संख्या में रिकॉर्ड पढ़ने का तरीका बताया गया है. साथ ही, इसमें ज़रूरत के हिसाब से, नतीजों के सेट पर लूपिंग करने का तरीका भी बताया गया है.

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

कनेक्शन बंद करना

किसी स्क्रिप्ट के पूरा होने पर, JDBC कनेक्शन अपने-आप बंद हो जाते हैं. (google.script.run कॉल को पूरा माना जाता है. भले ही, कॉल करने वाला एचटीएमएल सेवा पेज खुला रहे.)

इसके बावजूद, अगर आपको पता है कि स्क्रिप्ट के खत्म होने से पहले ही, कनेक्शन, स्टेटमेंट या नतीजों का सेट इस्तेमाल हो चुका है, तो उन्हें मैन्युअल तरीके से बंद करें. इसके लिए, JdbcConnection.close, JdbcStatement.close, या JdbcResultSet.close को कॉल करें.

चेतावनी या प्रॉम्प्ट डायलॉग दिखाने पर भी, खुले हुए सभी JDBC कनेक्शन बंद हो जाते हैं. हालांकि, यूज़र इंटरफ़ेस (यूआई) के अन्य एलिमेंट दिखाने पर ऐसा नहीं होता. जैसे, कस्टम मेन्यू या डायलॉग और कस्टम कॉन्टेंट वाले साइडबार.

Google, Google Workspace, और इनसे जुड़े चिह्न और लोगो Google LLC के ट्रेडमार्क हैं. अन्य सभी कंपनी और प्रॉडक्ट के नाम, उन कंपनियों के ट्रेडमार्क हैं जिनसे वे जुड़े हैं.