GASのJDBCでCloudSQLforMySQLのデータベースとやりとりする機会ががあったので備忘録に。
接続
この辺りはお決まりなので他の人の素敵な記事を参照してほしい。
▶️GASのJDBCサービスでCloud SQLデータベースに接続をする方法
以下のようなコードでDBに接続開始します。
var connName = 'DB接続名'; //Instance_connection_name
var userName = 'ユーザー名(rootとか)'; //user_name
var pw = 'パスワード'; //'user_password'
var dbName = 'DB名'; //database_name
var url = 'jdbc:google:mysql://' + connName + '/' + dbName;
var conn = Jdbc.getCloudSqlConnection(url, userName, pw);
接続以降の使い方
SELECTするとき
var sql = "SELECT name FROM sample_table WHERE id=?";
var stmt = conn.prepareStatement(sql);
stmt.setString(1, id);
var results = stmt.executeQuery();
※変数"conn"は前章(JDBC接続)のコードに続けて書いている前提です。
SQLは特別な部分は特にない。
"?"はsetString(n番目の?, 入れる値)
などで後から値を入れられます。(1から始めます)
パラメータを入れるときのみprepareStatement()が必要になります。
で、executeQuery()で実行。
パラメータを入れない場合はstmt(statement)がないので、
var stmt = conn.createStatement();
var results = stmt.executeQuery(sql);
これで生成と実行をします。
executeQuery()の戻り値の型はJdbcResultSetというものです。
▶️JdbcResultSetのリファレンス
件数取得
件数取得はもっと簡単にできないものか……
results.last(); //取得レコードの最後の行に移動
Logger.log(results.getRow()); //現在の行番号を取得してログに吐き出し
results.beforeFirst(); //最初の行に戻る
レコード件数の分だけ処理をする&取得データをget
while(results.next()){
results.getString('name'); //SELECTで取ってきたデータを取得(カラム名から)
results.getString(index); //番号から取得(1はじまり)
}
特定行のレコードの中身を見る
特定行のレコードの中身を見る時はgetMetaData()を使います。
▶️JdbcResultSetMetaDataのリファレンス
while(results.next()){
var metaData = results.getMetaData(); //特手行のデータがわかる
var numColumn = metaData.getColumnCount(); //列数がわかる
}
UPDATE・INSERT
UPDATE・INSERTも要領は同じですが、実行時に呼ぶ関数だけ違います。
var result = stmt.executeUpdate();
Can not issue data manipulation statements with executeQuery().
っていうエラーが出た時はここでexecuteQuery()をやってるはず。
DELETE
使う予定がなくなったのでもしやることがあれば更新します……。
リクエストがエラーになったとき
try-catchでエラーをcatchしたときにこんなの入れておけばエラー内容が綺麗に確認できます。
catch(e){
console.error("Type: " + e.name + "\n" +
"File: " + e.fileName + "(行 " + e.lineNumber + ")\n" +
"Message: " + e.message + "\n" +
"StackTrace:\n" + e.stack;);
}
最後にclose()を忘れずに
だいじです。
conn.close();
さいごに
手探りでいろいろやってるので、気付きがあれば更新するかもです。
Tipsとかあればむしろ教えて欲しい。