A5:SQL Mk-2のコマンドライン版 A5M2cmd.exe を使うと、SQLをバッチ実行して結果をCSVに保存できます。
今回は、
TABLE_A
TABLE_B
TABLE_C
というテーブル一覧を用意しておき、
SELECT *
FROM テーブル名
WHERE ...
の「テーブル名」部分だけを順番に差し替え、
TABLE_A.csv
TABLE_B.csv
TABLE_C.csv
として自動出力する方法を紹介します。
処理のイメージ
用意するのは次の3ファイルです。
C:\A5Export\
├─ tables.txt
├─ select_template.sql
└─ export_tables.bat
出力先は、
C:\A5Export\CSV\
とします。
処理は、
tables.txt
↓
TABLE_Aを取得
↓
SQLテンプレートの{TABLE}をTABLE_Aへ置換
↓
A5M2cmdで実行
↓
TABLE_A.csv
↓
TABLE_B
TABLE_C...
という流れです。
1. テーブル一覧を作る
tables.txt を作成します。
TABLE_A
TABLE_B
TABLE_C
スキーマ名を付ける場合は、
SCHEMA1.TABLE_A
SCHEMA1.TABLE_B
SCHEMA2.TABLE_C
のように記述しても構いません。
1行につき1テーブルにしておくのがポイントです。
2. SELECT文のテンプレートを作る
select_template.sql を作成します。
例えば単純に全件取得するなら、
SELECT *
FROM {TABLE};
とします。
条件を付けても構いません。
SELECT *
FROM {TABLE}
WHERE UPDATE_DATE >= CURRENT_DATE - 7;
必要な列だけ取得することもできます。
SELECT
ID,
NAME,
UPDATE_DATE
FROM {TABLE};
{TABLE} の部分を、バッチで実際のテーブル名に置き換えます。
3. バッチファイルを作る
export_tables.bat を作成します。
ここではPowerShellを使ってSQLテンプレートの文字列置換を行います。
@echo off
setlocal EnableDelayedExpansion
rem ==================================================
rem 設定
rem ==================================================
set "A5CMD=C:\A5M2cmd\A5M2cmd.exe"
set "BASE=C:\A5Export"
set "TABLELIST=%BASE%\tables.txt"
set "TEMPLATE=%BASE%\select_template.sql"
set "WORKSQL=%BASE%\work.sql"
set "OUTDIR=%BASE%\CSV"
rem DB接続文字列
set "CONNECT=__ConnectionType=Internal;ProviderName=PostgreSQL;UserName=USER;Password=PASSWORD;ServerName=localhost;Port=5432;Database=TESTDB;ProtocolVersion=30"
rem ==================================================
rem 出力フォルダ作成
rem ==================================================
if not exist "%OUTDIR%" mkdir "%OUTDIR%"
rem ==================================================
rem テーブルごとに処理
rem ==================================================
for /f "usebackq delims=" %%T in ("%TABLELIST%") do (
echo ==========================================
echo Export : %%T
echo ==========================================
powershell -NoProfile -Command ^
"(Get-Content -Raw '%TEMPLATE%').Replace('{TABLE}','%%T') | Set-Content -Encoding UTF8 '%WORKSQL%'"
"%A5CMD%" ^
"/Connect=%CONNECT%" ^
/RunSQL ^
/Encoding=UTF-8 ^
"/FileName=%WORKSQL%" ^
"/FilePattern=%OUTDIR%\%%T.csv"
if errorlevel 1 (
echo [ERROR] %%T
) else (
echo [OK] %%T
)
)
del "%WORKSQL%" 2>nul
echo.
echo Export completed.
endlocal
接続文字列は利用するDBに合わせて変更してください。
A5M2cmdは /Connect、/RunSQL、/FileName を使ってSQLファイルを実行でき、SELECT結果はCSVとして出力されます。
4. 実行するとどうなるか
tables.txt が、
TABLE_A
TABLE_B
TABLE_C
なら、内部ではまず、
SELECT *
FROM TABLE_A;
が生成されます。
A5M2cmdで実行したあと、次は、
SELECT *
FROM TABLE_B;
そして、
SELECT *
FROM TABLE_C;
と順番に処理します。
結果は、
C:\A5Export\CSV\
├─ TABLE_A.csv
├─ TABLE_B.csv
└─ TABLE_C.csv
となります。
/FilePattern には相対パス・絶対パスを含めて指定できるため、CSVの保存先を任意のフォルダにできます。
なぜSQLファイルを毎回作るのか
「A5M2cmdにテーブル名を直接パラメータとして渡せないのか?」
と思うかもしれません。
A5M2cmdについては、SQLファイルへ動的パラメータを渡す専用オプションがないと開発者から案内されています。
そのため、
A5M2cmd
↓
TABLE_Aという変数をSQLへ直接渡す
より、
バッチ
↓
SQLテンプレートを書き換える
↓
一時SQLを作る
↓
A5M2cmdで実行
という方法がシンプルです。
任意のSELECT文を使える
この方法のメリットは、単なる、
SELECT *
FROM {TABLE};
だけではないことです。
例えば件数だけ取得するなら、
SELECT COUNT(*)
FROM {TABLE};
特定条件だけなら、
SELECT *
FROM {TABLE}
WHERE STATUS = '1';
共通カラムがあるテーブルなら、
SELECT
ID,
NAME,
CREATED_AT,
UPDATED_AT
FROM {TABLE}
WHERE CREATED_AT >= '2026-01-01';
のようにできます。
つまり、
テーブル名だけ可変にして、SELECT条件は共通化する
用途に向いています。
PostgreSQLでの例
PostgreSQLなら、接続文字列は例えば次のようになります。
set "CONNECT=__ConnectionType=Internal;ProviderName=PostgreSQL;UserName=USER;Password=PASSWORD;ServerName=localhost;Port=5432;Database=TESTDB;ProtocolVersion=30"
実際のユーザー名・パスワード・サーバ名・DB名へ置き換えます。
MySQLでの例
MySQLなら例えば、
set "CONNECT=__ConnectionType=Internal;ProviderName=MySQL;UserName=USER;Password=PASSWORD;ServerName=localhost;Port=3306;Database=TESTDB"
という形です。
A5M2cmdでは、接続文字列を /Connect= に指定してSQLを実行します。
スキーマ名付きテーブルの場合
例えば、
public.customer
public.orders
master.product
という一覧なら、そのままSQLへ入れることもできます。
SELECT *
FROM public.customer;
CSVも、
public.customer.csv
public.orders.csv
master.product.csv
となります。
Windowsではピリオドはファイル名に使用できます。
もしCSV名からスキーマ名を除いて、
customer.csv
orders.csv
product.csv
としたい場合は、バッチ側でファイル名用の文字列を別途加工します。
SQL識別子に特殊文字がある場合は注意
今回のサンプルは、
TABLE_A
SCHEMA.TABLE_A
のような通常のテーブル名を想定しています。
テーブル名に、
空白
ハイフン
大文字小文字を厳密に区別する識別子
などが含まれる場合は、DBに応じた引用符が必要です。
PostgreSQLなら例えば、
SELECT *
FROM "My Table";
SQL Serverなら、
SELECT *
FROM [My Table];
となります。
この場合は tables.txt やSQLテンプレートの作り方を調整してください。
CSVをA5へ戻す場合
この方法で出力されるのは通常のCSVです。
そのため、A5:SQL Mk-2のCSVインポート機能で再利用できます。
例えば、
TABLE_A.csv
をA5:SQL Mk-2から読み込み、別テーブルへ投入するといった使い方ができます。
ただしCSVに保存されるのはSELECT結果だけです。
主キー
インデックス
外部キー
デフォルト値
トリガー
テーブル定義
などは保存されないので、DB全体の完全バックアップとして使うものではありません。
バックアップ用途ならSELECT *が分かりやすい
データ退避を目的にするなら、
SELECT *
FROM {TABLE};
としておけば、
TABLE_A.csv
TABLE_B.csv
TABLE_C.csv
という形でテーブル単位にデータを保存できます。
例えばWindowsタスクスケジューラと組み合わせれば、
毎日深夜
↓
export_tables.bat
↓
対象テーブルを順番にSELECT
↓
CSV保存
という自動処理にもできます。
注意:接続パスワード
サンプルでは分かりやすくするため、
Password=PASSWORD
としています。
実運用でバッチファイルへパスワードを直接書く場合は、その .bat ファイルを他ユーザーから読めないようアクセス権を設定するなどの対策が必要です。
まとめ
A5M2cmdで複数テーブルを順番にCSV出力する場合は、
tables.txt
↓
テーブル名を1件取得
↓
select_template.sql の {TABLE} を置換
↓
work.sqlを生成
↓
A5M2cmdで実行
↓
テーブル名.csv
という構成にすると分かりやすくなります。
例えば、
TABLE_A
TABLE_B
TABLE_C
というリストから、
TABLE_A.csv
TABLE_B.csv
TABLE_C.csv
を自動生成できます。
SQLテンプレートを書き換える方式なので、
SELECT *
FROM {TABLE};
だけでなく、
SELECT *
FROM {TABLE}
WHERE 条件;
など任意のSELECT文を共通適用できるのもメリットです。
大量のテーブルから同じ条件でデータを取得したい場合や、定期的に複数テーブルをCSV退避したい場合に便利な方法です。
