জেডিবিসি

TLS নিরাপত্তা প্রোটোকলের ১.০ এবং ১.১ সংস্করণ নিষ্ক্রিয় করা হয়েছে। সংযোগ স্থাপনের জন্য TLS ১.২ বা উচ্চতর সংস্করণ ব্যবহার করুন।

গুগল অ্যাপস স্ক্রিপ্ট JDBC সার্ভিসের মাধ্যমে বাহ্যিক ডেটাবেসের সাথে সংযোগ স্থাপন করতে পারে, যা স্ট্যান্ডার্ড জাভা ডেটাবেস কানেক্টিভিটি প্রযুক্তির একটি র‍্যাপার। JDBC সার্ভিসটি Google Cloud SQL for MySQL, MySQL, Microsoft SQL Server, Oracle এবং PostgreSQL ডেটাবেস সমর্থন করে।

যদি আপনার স্প্রেডশিট খুব বড় হয়ে যায় অথবা জটিল গণনার ক্ষেত্রে টাইমআউটের সমস্যা দেখা দেয়, তবে আপনার ডেটা একটি বাহ্যিক ডেটাবেসে স্থানান্তর করলে কর্মক্ষমতা এবং নির্ভরযোগ্যতা উল্লেখযোগ্যভাবে উন্নত হতে পারে।

JDBC ব্যবহার করে কোনো বাহ্যিক ডেটাবেস আপডেট করতে হলে, আপনার স্ক্রিপ্টকে অবশ্যই ডেটাবেসের সাথে একটি সংযোগ স্থাপন করতে হবে এবং তারপর SQL স্টেটমেন্ট পাঠিয়ে পরিবর্তনগুলো করতে হবে।

গুগল ক্লাউড এসকিউএল ডেটাবেস

গুগল ক্লাউড এসকিউএল আপনাকে গুগলের ক্লাউডে থাকা রিলেশনাল ডেটাবেস তৈরি করার সুযোগ দেয়। আপনার ব্যবহারের উপর ভিত্তি করে ক্লাউড এসকিউএল-এর জন্য চার্জ প্রযোজ্য হতে পারে।

ক্লাউড এসকিউএল কুইকস্টার্ট- এ তালিকাভুক্ত ধাপগুলো অনুসরণ করে একটি গুগল ক্লাউড এসকিউএল ইনস্ট্যান্স তৈরি করুন।

গুগল ক্লাউড এসকিউএল সংযোগ তৈরি করুন

অ্যাপস স্ক্রিপ্টের JDBC পরিষেবা ব্যবহার করে গুগল ক্লাউড SQL ডেটাবেসের সাথে সংযোগ স্থাপনের দুটি উপায় রয়েছে:

  • (সুপারিশকৃত) Jdbc.getCloudSqlConnection ব্যবহার করে সংযোগ স্থাপন করা
  • Jdbc.getConnection ব্যবহার করে সংযোগ স্থাপন করা হচ্ছে।

উভয় পদ্ধতিই বৈধ, কিন্তু দ্বিতীয় পদ্ধতিতে আপনার ডাটাবেসে প্রবেশের জন্য একগুচ্ছ আইপি রেঞ্জকে অনুমোদন দিতে হবে।

এই পদ্ধতিটি Jdbc.getCloudSqlConnection মেথড ব্যবহার করে একটি Google Cloud SQL MySQL ইনস্ট্যান্সের সাথে সংযোগ স্থাপন করে। ডাটাবেস URL-টি jdbc:google:mysql://subname এই আকারে থাকে, যেখানে subname হলো Google Cloud কনসোলের Cloud SQL ইনস্ট্যান্স Overview পৃষ্ঠায় তালিকাভুক্ত MySQL ইনস্ট্যান্স সংযোগের নাম

ক্লাউড এসকিউএল সার্ভারের সাথে সংযোগ করতে, Jdbc.getConnection দেখুন।

Jdbc.getConnection ব্যবহার করুন

এই পদ্ধতিটি ব্যবহার করার জন্য, আপনাকে নির্দিষ্ট ক্লাসলেস ইন্টার-ডোমেইন রাউটিং (CIDR) আইপি অ্যাড্রেস রেঞ্জ অনুমোদন করতে হবে, যাতে অ্যাপস স্ক্রিপ্টের সার্ভারগুলো আপনার ডেটাবেসের সাথে সংযোগ করতে পারে। আপনার স্ক্রিপ্ট চালানোর আগে, নিম্নলিখিত ধাপগুলো সম্পন্ন করুন:

  1. আপনার গুগল ক্লাউড এসকিউএল ইনস্ট্যান্সে, এই ডেটা সোর্স থেকে আইপি রেঞ্জগুলোকে এক এক করে অনুমোদন করুন

  2. আপনার ডাটাবেসের জন্য নির্ধারিত URL-টি কপি করুন; এটির গঠন jdbc:mysql:subname রকম হওয়া উচিত।

এই আইপি রেঞ্জগুলোকে অনুমোদন দেওয়ার পর, Jdbc.getConnection মেথডগুলোর যেকোনো একটি এবং আপনার আগে কপি করা URL ব্যবহার করে আপনার Google Cloud SQL ইনস্ট্যান্সে সংযোগ তৈরি করুন।

অন্যান্য ডেটাবেস

আপনার যদি আগে থেকেই নিজস্ব MySQL, Microsoft SQL Server, Oracle বা PostgreSQL ডেটাবেস থাকে, তাহলে Apps Script-এর JDBC সার্ভিসের মাধ্যমে সেটিতে সংযোগ করুন।

অন্যান্য ডাটাবেস সংযোগ তৈরি করুন

অ্যাপস স্ক্রিপ্ট জেডিবিসি পরিষেবা ব্যবহার করে একটি ডেটাবেস সংযোগ তৈরি করতে হলে, আপনার ডেটাবেস সেটিংসে অবশ্যই এই ডেটা সোর্স থেকে আইপি রেঞ্জগুলোকে অনুমোদন করতে হবে।

JDBC সার্ভিস শুধুমাত্র ১০২৫ বা তার পরবর্তী পোর্টগুলোতে সংযোগ করতে পারে। নিশ্চিত করুন যে আপনার ডাটাবেস এর চেয়ে কম কোনো পোর্টে ব্যবহৃত হচ্ছে না।

এই অ্যালাওলিস্টগুলো তৈরি হয়ে গেলে, Jdbc.getConnection মেথডগুলোর যেকোনো একটি এবং আপনার ডাটাবেসের URL ব্যবহার করে ডাটাবেসের সাথে একটি সংযোগ তৈরি করুন।

নমুনা কোড

নিম্নলিখিত নমুনা কোডটি ধরে নেয় যে আপনি একটি গুগল ক্লাউড এসকিউএল (Google Cloud SQL) ডেটাবেসের সাথে সংযোগ করছেন এবং এটি Jdbc.getCloudSqlConnection পদ্ধতি ব্যবহার করে ডেটাবেস সংযোগ তৈরি করে। অন্যান্য ডেটাবেসের জন্য আপনাকে অবশ্যই Jdbc.getConnection পদ্ধতি ব্যবহার করে ডেটাবেস সংযোগ তৈরি করতে হবে।

JDBC মেথডগুলো সম্পর্কে আরও তথ্যের জন্য, জাভার JDBC ডকুমেন্টেশন দেখুন।

একটি ডাটাবেস, ব্যবহারকারী এবং টেবিল তৈরি করুন।

বেশিরভাগ ডেভেলপার ডাটাবেস, ইউজার এবং টেবিল তৈরি করার জন্য MySQL কমান্ড-লাইন টুল ব্যবহার করেন। তবে, অ্যাপস স্ক্রিপ্টেও একই কাজ করা সম্ভব, যেমনটি নিচের উদাহরণে দেখানো হয়েছে। অন্তত আরও একটি ইউজার তৈরি করুন, যাতে আপনার স্ক্রিপ্টকে সবসময় 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);
  }
}

ডাটাবেসে লিখুন

নিম্নলিখিত উদাহরণগুলিতে দেখানো হয়েছে কীভাবে ডাটাবেসে একটি একক রেকর্ড এবং সেইসাথে ৫০০টি রেকর্ডের একটি ব্যাচ লিখতে হয়। বাল্ক অপারেশনের জন্য ব্যাচিং অপরিহার্য।

প্যারামিটারাইজড স্টেটমেন্ট ব্যবহার করা হয়, যেখানে ভেরিয়েবলগুলোকে ? চিহ্ন দ্বারা বোঝানো হয়। 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);
  }
}

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

ডাটাবেস থেকে পড়ুন

এই উদাহরণটি দেখায় কিভাবে ডাটাবেস থেকে বিপুল সংখ্যক রেকর্ড পড়তে হয় এবং প্রয়োজনে ফলাফল সেটের উপর লুপ চালাতে হয়।

পরিষেবা/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);
  }
}

ঘনিষ্ঠ সংযোগ

কোনো স্ক্রিপ্টের নির্বাহ শেষ হলে JDBC সংযোগগুলি স্বয়ংক্রিয়ভাবে বন্ধ হয়ে যায়। (একক google.script.run কল একটি সম্পূর্ণ নির্বাহ হিসাবে গণ্য হয়, এমনকি যে HTML পরিষেবা পৃষ্ঠাটি থেকে কলটি করা হয়েছে সেটি খোলা থাকলেও।)

তথাপি, যদি আপনি জানেন যে স্ক্রিপ্ট শেষ হওয়ার আগেই কোনো কানেকশন, স্টেটমেন্ট বা রেজাল্ট সেটের কাজ শেষ, তাহলে JdbcConnection.close , JdbcStatement.close বা JdbcResultSet.close কল করে সেগুলোকে ম্যানুয়ালি বন্ধ করুন।

কোনো অ্যালার্ট বা প্রম্পট ডায়ালগ দেখালে তা যেকোনো খোলা JDBC সংযোগও বিচ্ছিন্ন করে দেয়। তবে, অন্যান্য প্রদর্শিত UI উপাদান—যেমন কাস্টম মেনু বা ডায়ালগ এবং কাস্টম কন্টেন্টসহ সাইডবার—এর ক্ষেত্রে এমনটা হয় না।

গুগল, গুগল ওয়ার্কস্পেস এবং সংশ্লিষ্ট চিহ্ন ও লোগোসমূহ হলো গুগল এলএলসি (Google LLC)-এর ট্রেডমার্ক। অন্য সকল কোম্পানি ও পণ্যের নাম তাদের সংশ্লিষ্ট কোম্পানিগুলোর ট্রেডমার্ক।