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 ทำได้ 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

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

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

หากต้องการใช้วิธีนี้ คุณต้องให้สิทธิ์ การกำหนดเส้นทางระหว่างโดเมนแบบ Classless (CIDR) ช่วงที่อยู่ IP เพื่อให้เซิร์ฟเวอร์ของ 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 ได้

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

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