JDBC

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

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

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

ใช้ Jdbc.getConnection(url)

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

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

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

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

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

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

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

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

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

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

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

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

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

นักพัฒนาซอฟต์แวร์ส่วนใหญ่ใช้เครื่องมือบรรทัดคำสั่ง MySQL เพื่อสร้างฐานข้อมูล ผู้ใช้ และตาราง อย่างไรก็ตาม คุณสามารถทำสิ่งเดียวกันนี้ในสคริปต์ของแอปได้ ดังที่แสดงด้านล่าง คุณควรสร้างผู้ใช้รายอื่นอย่างน้อย 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 ชื่อบริษัทและชื่อผลิตภัณฑ์อื่นๆ ทั้งหมดเป็นเครื่องหมายการค้าของบริษัทที่เกี่ยวข้อง