LoginSignup
2
3

More than 3 years have passed since last update.

GASのJDBCでCloudSQLのデータベースとやり取りする基礎

Last updated at Posted at 2020-10-22

GASのJDBCでCloudSQLforMySQLのデータベースとやりとりする機会ががあったので備忘録に。

接続

この辺りはお決まりなので他の人の素敵な記事を参照してほしい。
▶️GASのJDBCサービスでCloud SQLデータベースに接続をする方法

以下のようなコードでDBに接続開始します。

connection.js
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するとき

select.js
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)がないので、

createStatement.js
var stmt = conn.createStatement();
var results = stmt.executeQuery(sql);

これで生成と実行をします。

executeQuery()の戻り値の型はJdbcResultSetというものです。
▶️JdbcResultSetのリファレンス

件数取得

件数取得はもっと簡単にできないものか……

getNumItems.js
results.last(); //取得レコードの最後の行に移動
Logger.log(results.getRow()); //現在の行番号を取得してログに吐き出し
results.beforeFirst(); //最初の行に戻る

レコード件数の分だけ処理をする&取得データをget

action.js
while(results.next()){
  results.getString('name'); //SELECTで取ってきたデータを取得(カラム名から)
  results.getString(index); //番号から取得(1はじまり)
}

特定行のレコードの中身を見る

特定行のレコードの中身を見る時はgetMetaData()を使います。
▶️JdbcResultSetMetaDataのリファレンス

getRowData.js
while(results.next()){
  var metaData = results.getMetaData(); //特手行のデータがわかる
  var numColumn = metaData.getColumnCount(); //列数がわかる
}

UPDATE・INSERT

UPDATE・INSERTも要領は同じですが、実行時に呼ぶ関数だけ違います。

exeUI.js
var result = stmt.executeUpdate();

Can not issue data manipulation statements with executeQuery().
っていうエラーが出た時はここでexecuteQuery()をやってるはず。

DELETE

使う予定がなくなったのでもしやることがあれば更新します……。

リクエストがエラーになったとき

try-catchでエラーをcatchしたときにこんなの入れておけばエラー内容が綺麗に確認できます。

error.js
catch(e){
  console.error("Type: " + e.name + "\n" +
                "File: " + e.fileName + "(行 " + e.lineNumber + ")\n" +
                "Message: " + e.message + "\n" +
                "StackTrace:\n" + e.stack;);
}

最後にclose()を忘れずに

だいじです。

close.js
conn.close();

さいごに

手探りでいろいろやってるので、気付きがあれば更新するかもです。

Tipsとかあればむしろ教えて欲しい。

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3