JDBC

จัดทุกอย่างให้เป็นระเบียบอยู่เสมอด้วยคอลเล็กชัน บันทึกและจัดหมวดหมู่เนื้อหาตามค่ากำหนดของคุณ

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

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

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

หากต้องการเชื่อมต่อกับเซิร์ฟเวอร์ SQL ของ Cloud 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 Script ดังที่แสดงด้านล่าง คุณควรสร้างผู้ใช้รายอื่นอย่างน้อย 1 คนเพื่อให้สคริปต์ไม่จําเป็นต้องเชื่อมต่อฐานข้อมูลเป็น 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);
  }
}

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

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

บริการ/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 ชื่อบริษัทและชื่อผลิตภัณฑ์อื่นๆ ทั้งหมดเป็นเครื่องหมายการค้าของบริษัทที่เกี่ยวข้อง