みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。
GASからJDBCサービスを使ってCloud SQLのデータベースにアクセスする方法をシリーズでお伝えしています。
前回の記事はこちら。
GASでCloud SQLにクエリを実行した結果を取り出す方法をお伝えしました。
さて、データベースの値を取り出すだけでなく、レコードの追加や更新、削除などもしていきたいですよね…
ということで、今回はGASのJDBCサービスでCloud SQLのデータベースにレコードを追加する方法をお伝えします。
では、行ってみましょう!
前回のおさらい
前回作成したコードはこちらです。
var connectionName = '*****データベース接続名*****'; //Instance_connection_name var userName = '*****ユーザー名*****'; //user_name var password = '*****パスワード*****'; //'user_password' var databaseName = 'guestbook'; //database_name var url = 'jdbc:google:mysql://' + connectionName + '/' + databaseName; function readFromTable() { var connection = Jdbc.getCloudSqlConnection(url, userName, password); var statement = connection.createStatement(); var results = statement.executeQuery('SELECT * FROM entries'); while (results.next()) { var entryID = results.getInt('entryID'); var guestName = results.getString('guestName'); var content = results.getString('content'); Logger.log('%s t %s t %s', entryID, guestName, content); } results.close(); statement.close(); connection.close(); }
既にCloud SQLに存在している「guestbook」というデータベースの、「entries」というテーブルからすべてのレコードを取り出して、カラム「guestName」「content」の値を表示するというものです。
Cloud SQLのCloud Shellで2つほどレコードを追加していましたので、実行すると以下のように表示されました。
このデータベースについて、他の操作を実行していきましょう。
GASからCloud SQLのデータベースにレコードを追加する
今回は、Cloud SQLのデータベースへ新たなレコードを追加していきたいと思います。
レコードを追加するには、SQLのINSERT文を使うんでしたね。
このSQLステートメントを実行する命令を、GASのJDBCサービスから探していけばよいわけですね。
更新系のSQLステートメントを実行する
今回実行しようとしている、INSERT文や、レコードを更新するUPDATE文、レコードを削除するDELETE文など、更新系のSQLを実行する命令として、executeUpdateメソッドがあります。
executeUpdateメソッドの対象は、JdbcPreparedStatementオブジェクトで、そこに既にセットされているSQLステートメントを実行するというものです。
ちなみに、整数の戻り値として、SQLの実行により更新された行数を返します。
JdbcPreparedStatementオブジェクトが変数statementに割り当てられているとすると、以下のように使用することができます。
var count = statement.executeUpdate(); Logger.log(count);
さて、SELECT文を実行するときには、JdbcStatementオブジェクトを使いました。
実は、INSERT文もJdbcStatementオブジェクトで実行できるのですが、実際は何が違うんでしょうか?
JdbcPreparedStatementオブジェクトとは
JdbcPreparedStatementオブジェクトとは、SQLステートメントを前もって準備しておくためのオブジェクトです。
具体的には以下のような表記をします。
命令の中に「?」記号が2つ含まれています。
この「?」記号は、プレースホルダーとして使用することができ、後から適宜プレースホルダーに値を入れ込んで使用することができます。
JdbcStatementオブジェクトとの違いは、このプレースホルダーがあるかどうかです。
複数のレコードについて更新系のSQL文を実行したいときには、プレースホルダーを使って効率的に実行できるので、JdbcPreparedStatementオブジェクトを使うと便利なのです。
JdbcPreparedStatementオブジェクトを生成する
JdbcPreparedStatementオブジェクトを生成するには、以下のprepareStatementメソッドを使います。
引数SQLには、ひとつ以上の「?」記号を含むパラメータ化されたSQLステートメントを指定します。
前述のINSERT文を使うのであれば、以下のようなコードになりますね。
var statement = connection.prepareStatement('INSERT INTO entries (guestName, content) values (?, ?)'); // 何らかの処理 var count = statement.executeUpdate(); Logger.log(count);
プレースホルダーに値を設定する
続いて、SQL文を実行する前に、プレースホルダーに値を設定する必要がありますね。
JdbcPreparedStatementオブジェクトのプレースホルダーに文字列を設定するには、setStringメソッドを使います。
データ型によって、setIntメソッドや、setDateメソッドなど、異なるメソッドを使う必要がありますので、必要に応じて以下で調べてみてください。
レコードをひとつ追加するとして、各カラムに対して以下のような文字列を格納するとしましょう。
- guestName: Third guest
- content: I just got here too!
すると、スクリプトは以下のようになります。
var statement = connection.prepareStatement('INSERT INTO entries (guestName, content) values (?, ?)'); statement.setString(1, 'Third Guest'); statement.setString(2, 'I just got here too!'); var count = statement.executeUpdate(); Logger.log(count);
JdbcPreparedStatementオブジェクトを閉じる
JdbcStatementオブジェクトと同様、JdbcPreparedStatementオブジェクトも、使用後はcloseメソッドで明示的に閉じておきます。
レコードの追加を実行を確認する
では、実際にコードを実行して、GASからCloud SQLへのレコード追加について動作を確認していきましょう。
まとめのコードは以下のとおりになります。
var connectionName = '*****データベース接続名*****'; //Instance_connection_name var userName = '*****ユーザー名*****'; //user_name var password = '*****パスワード*****'; //'user_password' var databaseName = 'guestbook'; //database_name var url = 'jdbc:google:mysql://' + connectionName + '/' + databaseName; function writeOneRecord() { var connection = Jdbc.getCloudSqlConnection(url, userName, password); var statement = connection.prepareStatement('INSERT INTO entries (guestName, content) values (?, ?)'); statement.setString(1, 'Third Guest'); statement.setString(2, 'I just got here too!'); var count = statement.executeUpdate(); Logger.log(count); statement.close(); connection.close(); }
まず、writeOneRecord関数を実行してログを確認します。
実行の結果はここでは確認できませんが、SQLの実行結果として1行の更新を行ったということは確認できます。
続いて、前回作成したreadFromTable関数を実行して、テーブルの中身を確認してみましょう。
INSERT文による3つ目のデータが追加されていることが確認できますね。
まとめ
以上、GASのJDBCサービスでCloud SQLのデータベースにレコードを追加する方法をお伝えしました。
おそらく、大きく分けてSELECT文によるクエリを実行する方法と、今回紹介した更新系SQL文を実行する方法の2パターンを使うことで、ほぼ対応できるかなと思っています。
なので、いくつか覚えることがありますが、頑張って使いこなしていきましょう!
次回は、他の更新系のSQLを実行していきましょう。
どうぞお楽しみに!
連載目次:GASのJDBCサービスでCloud SQLのDBを操作する
GASのデータベースの多くはスプレッドシートを使用しますが、ちゃんとしたデータベースを使用したい場合があります。そこで、JBDCサービスを使ってCloud SQLを使用する方法をシリーズでお伝えしていきます。- GASのデータベースとして、なぜCloud SQLが有効なのか?その概要とメリット
- GASでデータベースとして使用するCloud SQLインスタンスを作成する方法
- GCPのCloud Shellを使ってCloud SQLインスタンスに接続する方法
- GCPのCloud SQLインスタンスにSQL文でデータベースを作成する方法
- GCPのCloud SQLデータベースにSQLでテーブルを作成する方法
- GCPのCloud SQLデータベースのテーブルにSQLでレコードを追加する方法
- GASのJDBCサービスでCloud SQLデータベースに接続をする方法
- GASのJDBCサービスでCloud SQLデータベースにクエリを実行する方法
- GASのJDBCサービスでCloud SQLにクエリを実行した結果を取り出す方法
- GASのJBDCサービスでCloud SQLのデータベースにレコードを追加する方法
- GASのJDBCサービスでCloud SQLのデータベースに複数のSQLを一括で実行する方法