জেডিবিসি

অ্যাপস স্ক্রিপ্ট JDBC পরিষেবার মাধ্যমে বহিরাগত ডাটাবেসের সাথে সংযোগ স্থাপন করতে পারে, যা স্ট্যান্ডার্ড জাভা ডেটাবেস কানেক্টিভিটি প্রযুক্তির চারপাশে একটি মোড়ক। JDBC পরিষেবা MySQL, MySQL, Microsoft SQL সার্ভার এবং Oracle ডাটাবেসের জন্য Google Cloud SQL সমর্থন করে।

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

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

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

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

গুগল ক্লাউড এসকিউএল সংযোগ তৈরি করা হচ্ছে

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

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

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

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

Jdbc.getConnection(url) ব্যবহার করা হচ্ছে

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

  1. আপনার Google Cloud SQL ইনস্ট্যান্সে, এই ডেটা সোর্স থেকে একের পর এক IP রেঞ্জ অনুমোদন করুন

  2. আপনার ডাটাবেসে নির্ধারিত URL টি কপি করুন; এর jdbc:mysql:subname ফর্মটি থাকা উচিত।

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

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

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

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

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

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

নমুনা কোড

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

JDBC পদ্ধতি সম্পর্কে আরও তথ্যের জন্য, 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);
  }
}

/**
 * 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, Google Workspace, এবং সম্পর্কিত চিহ্ন এবং লোগো হল Google LLC-এর ট্রেডমার্ক। অন্যান্য সমস্ত কোম্পানি এবং পণ্যের নাম হল সেই কোম্পানিগুলির ট্রেডমার্ক যার সাথে তারা যুক্ত।​