JDBC

Apps Script เชื่อมต่อกับฐานข้อมูลภายนอกได้ผ่านบริการ JDBC ซึ่งเป็น Wrapper ของเทคโนโลยีการเชื่อมต่อฐานข้อมูล Java แบบมาตรฐาน บริการ JDBC รองรับ Google Cloud SQL สำหรับ MySQL, MySQL, เซิร์ฟเวอร์ Microsoft SQL และฐานข้อมูล 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 Console

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