JDBC

Apps Script สามารถเชื่อมต่อกับฐานข้อมูลภายนอกผ่านบริการ JDBC ซึ่งเป็น Wrapper รอบเทคโนโลยี 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 ทำได้ 2 วิธีดังนี้

โดยจะอธิบายวิธีการเหล่านี้ด้านล่าง ทั้ง 2 วิธีใช้ได้ แต่ในวิธีที่ 2 คุณต้องให้สิทธิ์ช่วง IP ชุดหนึ่งเพื่อเข้าถึงฐานข้อมูล

เมธอดนี้สร้างการเชื่อมต่อกับอินสแตนซ์ Google Cloud SQL MySQL โดยใช้เมธอด Jdbc.getCloudSqlConnection(url) URL ของฐานข้อมูลมีรูปแบบเป็น jdbc:google:mysql://subname โดยที่ subname คือชื่อการเชื่อมต่ออินสแตนซ์ MySQL ที่แสดงในหน้าภาพรวมของอินสแตนซ์ Cloud SQL ใน Google Cloud Console

หากต้องการเชื่อมต่อกับ SQL Server ใน Cloud SQL โปรดดู Jdbc.getConnection(url)

การใช้ Jdbc.getConnection(url)

หากต้องการใช้วิธีนี้ คุณต้องให้สิทธิ์ช่วงที่อยู่ IP ของ Classless Inter-Domain Routing (CIDR) บางช่วง เพื่อให้เซิร์ฟเวอร์ของ Apps Script เชื่อมต่อกับฐานข้อมูลได้ ก่อนเรียกใช้สคริปต์ ให้ทำตามขั้นตอนต่อไปนี้

  1. ในอินสแตนซ์ Google Cloud SQL ให้ให้สิทธิ์ช่วง IP ทีละช่วงจากแหล่งข้อมูลนี้

  2. คัดลอก URL ที่กำหนดให้กับฐานข้อมูลของคุณ โดย URL ควรมีรูปแบบ jdbc:mysql:subname

เมื่อให้สิทธิ์ช่วง IP เหล่านี้แล้ว คุณจะสร้างการเชื่อมต่อกับอินสแตนซ์ Google Cloud SQL ได้โดยใช้วิธีการ Jdbc.getConnection(url) วิธีการใดวิธีการหนึ่งและ URL ที่คัดลอกไว้ข้างต้น

ฐานข้อมูลอื่นๆ

หากมีฐานข้อมูล MySQL, Microsoft SQL Server หรือ Oracle อยู่แล้ว คุณจะเชื่อมต่อกับฐานข้อมูลดังกล่าวผ่านบริการ JDBC ของ Apps Script ได้

สร้างการเชื่อมต่อฐานข้อมูลอื่นๆ

หากต้องการสร้างการเชื่อมต่อฐานข้อมูลโดยใช้ JDBC service ของ Apps Script คุณต้องให้สิทธิ์ช่วง IP จากแหล่งข้อมูลนี้ในการตั้งค่าฐานข้อมูล

เมื่อสร้างรายการที่อนุญาตเหล่านี้แล้ว คุณจะสร้างการเชื่อมต่อกับฐานข้อมูลได้ โดยใช้วิธีการใดวิธีการหนึ่งของ Jdbc.getConnection(url) และ URL ของฐานข้อมูล

โค้ดตัวอย่าง

โค้ดตัวอย่างด้านล่างนี้ถือว่าคุณกำลังเชื่อมต่อกับฐานข้อมูล Google Cloud SQL และสร้างการเชื่อมต่อฐานข้อมูลโดยใช้เมธอด Jdbc.getCloudSqlConnection(url) สำหรับฐานข้อมูลอื่นๆ คุณต้องใช้เมธอด Jdbc.getConnection(url) เพื่อสร้างการเชื่อมต่อฐานข้อมูล

ดูข้อมูลเพิ่มเติมเกี่ยวกับเมธอด JDBC ได้ที่เอกสารประกอบ Java สำหรับ JDBC

สร้างฐานข้อมูล ผู้ใช้ และตาราง

นักพัฒนาซอฟต์แวร์ส่วนใหญ่ใช้เครื่องมือบรรทัดคำสั่ง MySQL เพื่อ สร้างฐานข้อมูล ผู้ใช้ และตาราง อย่างไรก็ตาม คุณสามารถทำสิ่งเดียวกันนี้ใน Apps Script ได้ตามที่แสดงด้านล่าง คุณควรสร้างผู้ใช้รายอื่นอย่างน้อย 1 รายเพื่อให้สคริปต์ไม่ต้องเชื่อมต่อกับฐานข้อมูลในฐานะ root เสมอไป

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

เขียนไปยังฐานข้อมูล

ตัวอย่างด้านล่างแสดงวิธีเขียนระเบียนเดียวลงในฐานข้อมูล รวมถึงกลุ่มระเบียน 500 รายการ การประมวลผลแบบเป็นชุดมีความสำคัญอย่างยิ่งสำหรับการดำเนินการแบบกลุ่ม

นอกจากนี้ โปรดสังเกตการใช้คำสั่งที่กำหนดพารามิเตอร์ ซึ่งตัวแปรจะ ระบุด้วย ? หากต้องการป้องกันการโจมตีด้วยการแทรก SQL คุณควรใช้คำสั่งที่มีพารามิเตอร์เพื่อหลีกเลี่ยงข้อมูลทั้งหมดที่ผู้ใช้ระบุ

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

อ่านจากฐานข้อมูล

ตัวอย่างนี้แสดงวิธีอ่านระเบียนจำนวนมากจากฐานข้อมูล โดยวนซ้ำชุดผลลัพธ์ตามที่จำเป็น

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

การปิดการเชื่อมต่อ

การเชื่อมต่อ JDBC จะปิดโดยอัตโนมัติเมื่อสคริปต์ทำงานเสร็จ (โปรดทราบว่าการเรียกใช้ฟังก์ชัน google.script.run ครั้งเดียวถือเป็นการดำเนินการที่เสร็จสมบูรณ์ แม้ว่าหน้าบริการ HTML ที่ทำการเรียกใช้จะยังเปิดอยู่ก็ตาม)

อย่างไรก็ตาม หากคุณทราบว่าการเชื่อมต่อ คำสั่ง หรือชุดผลลัพธ์เสร็จสิ้นแล้ว ก่อนที่สคริปต์จะสิ้นสุด คุณควรปิดด้วยตนเองโดยเรียกใช้ JdbcConnection.close() JdbcStatement.close() หรือ JdbcResultSet.close()

การแสดงกล่องโต้ตอบการแจ้งเตือนหรือข้อความแจ้ง จะปิดการเชื่อมต่อ JDBC ที่เปิดอยู่ด้วย แต่ UI การแสดงอื่นๆ เช่น เมนูหรือกล่องโต้ตอบที่กำหนดเอง และแถบด้านข้างที่มีเนื้อหาที่กำหนดเอง จะไม่ได้รับผลกระทบ

​Google, Google Workspace รวมถึงเครื่องหมายและโลโก้ที่เกี่ยวข้องเป็นเครื่องหมายการค้าของ Google LLC ชื่อบริษัทและชื่อผลิตภัณฑ์อื่นๆ ทั้งหมดเป็นเครื่องหมายการค้าของบริษัทที่เกี่ยวข้อง​