GASから外部データベースを操作する方法(日本語対応)【JDBC接続】

コンピュータ関連
この記事は約9分で読めます。

2023.12.21 

GoogleAppsScript(以降、GASと略)を使って、外部サーバにあるデータベースを操作したい」という要望を受け、対応した中で詰まった点などを共有できればと思い記事にしました。

適当な紹介ページが多く、特に、日本語(全角文字)データを対象DBに保存できず悩みましたので・・・。

本記事では、JDBC接続を利用して、外部サーバ上にあるMySQLに接続する方法を紹介します。

前提の話など含みますので、コードだけ知りたい人は見出しから飛んでください。

詳細は以下にて説明しています(初、中級者向け解説)。

※プロではないので、問題があったら教えて欲しい

(全行程の所要時間:コピペで終わり)

 

0.実行環境

■実行環境

・対象DB:MySQL5.7(さくらVPS上)

※5系以上じゃないとJDBC接続が使えないっぽい?

 

1.実装方法

JDBC接続とは

JDBCとは、 Java Database Connectivity の略で、Java言語を利用してリレーショナルデータベース(以降、RDBと略)に接続するためのインターフェースになります。

GASはJavaで作成されるため、JDBC接続インターフェースも標準搭載しています。

上記理由で、GASからのDB接続は基本的にJDBC接続を利用することとなります。

 

事前準備(データベース設定)

そもそも外部アクセスさせるため、外部サーバ自体が次の状態になっている必要があります。

本記事で紹介している方法以外は、割愛させていただきます。

・DBのポートが解放されていること(データベース、VPS両方)

・DBへの接続IP条件がクリアになっていること(localhost)

・DB登録ユーザ(DB操作ユーザ)のホストが、「すべて(%)」になっていること(localhostではない)

※ただDBをインストールしただけだと、上記が初期値のlocalhostかつポート開放されていない状態になっていることが多いので、要確認となります

 

実装ソース(GAS)

//SQL接続(SELECT)(本番)
function dbConnectionSelect(sqlstr){
  // --------------------------------
  // SSL 接続なしで接続(JDBC)
  // --------------------------------


  // 接続先設定
  var connectionIp = '接続先ドメイン名 or IPアドレス'; // 接続のMysqlのIPアドレス(ホスト名も可)(XXX.XXX.XXX.XXX)
  var userName = 'username'; // 接続で使うユーザ名
  var passwd = 'password'; // 接続で使うパスワード
  var databaseName = 'dbname?useUnicode=true&characterEncoding=utf8'; // データベース名
  var port = '3306'; //対象DBのポート番号
  var addr = 'jdbc:mysql://' + connectionIp + ':' + port + '/' + databaseName;

  Logger.log('start mysql con');
  Logger.log(addr);

  // DBにコネクションをはる
  var connection = Jdbc.getConnection(addr, userName, passwd);
  //Logger.log(connection.getCatalog());

  // Select文を実行するための処理 ここから
  // sqlステートメントをデータベースに送信するためのオブジェクトを作る
  var statement = connection.createStatement();

  // sqlを実行して結果をオブジェクトに入れる
  var result = statement.executeQuery(sqlstr);


  //Insert、Update、Delete文は以下の構文を利用(返り値は、True or False)
  //var result = statement.executeUpdate(sqlstr);

  
  //結果の格納受け
  //var resdate = [];

  // 結果を取り出す例
  var i = 0;
  while (result.next()) {
    // 数値の場合は、getInt('カラム名')を使う。
    //例・・・var id = result.getInt('AREACD');
    // 文字列の場合は、getString('カラム名')を使う。
    //例・・・var name = result.getString('AREANAME');
    // 取得した内容をログに出力する
    //Logger.log(id + ':' + name);

    //取得した内容を変数に格納
    //resdate[i] = result.getString('KEYID');
    //i++;
  }

  // Select文を実行する処理はここまで
  // コネクションを閉じる
  connection.close();

  //帰り値例
  return resdate;

}

上記ソースを実行し、JDBC接続ができない場合は、前ページ「事前準備」の状態か確認してみてください。

 

説明

ミソとしては、DB名変数定義の部分で、DB名の後ろに「?useUnicode=true&characterEncoding=utf8」というオプションを付与することです。

このオプションを付けることで、日本語(全角文字)をDBに登録することができます。(付けないと、全角文字がNullで登録される)

 

2.最後に

冒頭で書いた通り、色々問題を回避するように書くのが理想ではあります。

修正要望などは、既存の要件を損なわないようにしなければならないので、結構頭を抱えることがあります。。。

ピンポイントで悩んでいる方のお役にたてたら幸いです。

以上。 

(不明点あればコメント頂ければ、可能な限りお答えします。)

▼オススメ教本▼

プロフィール
当ブログ管理者
shibatty

SIer→CE兼プログラマー。
趣味:ダム巡り、車、バイク、おキャンプ。
愛車:YAMAHA セロー250、Kawasaki Ninja250R。
実績:BikeJIN2018ラリー完走。 2017,18,19,21年SSTR完走。 日本一周ダムカード収集ラリー完走(2018.5.26~11/20)。

shibattyをフォローする
コンピュータ関連
シェアする
shibattyをフォローする

コメント

タイトルとURLをコピーしました