adosql.js

gist: 130016 - adosql.js

データベースに ADO で接続して SQL を実行できるコンソールスクリプトを作った。通常はデータベース付属のツールがインストールされていると思うので必要ないと思われます。

Microsoft Access にはこんな感じで接続する。接続文字列変えればいろんなデータベースに接続できる、きっと。

C:\Temp\db>cscript //nologo adosql.js -c "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=user.mdb"
? select ...

行頭「!」入力は、eval してその結果を表示する。

? !1 + 2
3

行頭「$」入力は、コマンド実行。

? $cmd /c dir
 ドライブ C のボリューム ラベルがありません。
 ボリューム シリアル番号は 4C18-D6C3 です

 C:\Temp\db のディレクトリ

2009/06/15  17:37    <DIR>          .
2009/06/15  17:37    <DIR>          ..
2009/06/15  16:58             5,499 adosql.js
               1 個のファイル               5,499 バイト
               2 個のディレクトリ   6,996,881,408 バイトの空き領域

「quit」で終了。

? quit

おまけ機能で Microsoft ODBC Desktop Database Drivers を簡単に使えるようにしてある。

引数にフォルダを指定した場合、そのフォルダのテキストファイルがテーブルとなる。

C:\Temp\db>cscript //nologo adosql.js .

この場合、テーブルがカレントフォルダの tbl1.csv ファイルとして作成される。

? create table tbl1.csv (name varchar, age integer)
? $cmd /c dir
 ドライブ C のボリューム ラベルがありません。
 ボリューム シリアル番号は 4C18-D6C3 です

 C:\Temp\db のディレクトリ

2009/06/15  17:43    <DIR>          .
2009/06/15  17:43    <DIR>          ..
2009/06/15  16:58             5,499 adosql.js
2009/06/15  17:43               115 schema.ini
2009/06/15  17:43                14 tbl1.csv
               3 個のファイル               5,628 バイト
               2 個のディレクトリ   6,996,881,408 バイトの空き領域

普通に SQL を発行できる。

? insert into tbl1.csv values('Taro', 28)
? select * from tbl1.csv
#>name,age
1>Taro,28

作成された tbl1.csv はこんなんなっている。普通の CSV ファイル。

? $cmd /c type tbl1.csv
"name","age"
"Taro",28

なんか schema.ini ファイルも作成されるが基本気にしない。

? $cmd /c type schema.ini
[tbl1.csv]
ColNameHeader=True
CharacterSet=932
Format=CSVDelimited
Col1=name Char Width 255
Col2=age Integer

schema.ini がなくてもそれなりに動作するので、既存の CSV ファイルも操作できるよ。

? $cmd /c echo f1,f2 > tbl9.csv
? $cmd /c echo boo, 256 >> tbl9.csv
? $cmd /c echo foo, 128 >> tbl9.csv
? select * from tbl9.csv where f1 = 'boo'
#>f1,f2
1>boo,256
? quit
C:\Temp\db>

引数に xls ファイルを指定した場合、そのファイルがデータベースになる感じ。

C:\Temp\db>cscript //nologo adosql.js db.xls
? $cmd /c dir db.xls
 ドライブ C のボリューム ラベルがありません。
 ボリューム シリアル番号は 4C18-D6C3 です

 C:\Temp\db のディレクトリ

2009/06/15  17:53             9,216 db.xls
               1 個のファイル               9,216 バイト
               0 個のディレクトリ   7,117,938,688 バイトの空き領域
? create table tbl2 (name varchar, age integer)
? insert into tbl2 values('Jiro', 24)
? select * from tbl2
#>name,age
1>Jiro,24
? update tbl2 set age = 25 where name = 'Jiro'
? select * from tbl2
#>name,age
1>Jiro,25

引数には mdb ファイルも指定できる。

C:\Temp\db>cscript //nologo adosql.js db3.mdb
C:\Temp\db\adosql.js(40, 5) Microsoft OLE DB Provider for ODBC Drivers: [Microso
ft][ODBC Microsoft Access Driver] ファイル '(不明)' が見つかりませんでした。

けど、ドライバは xls ファイルとは違い自動で mdb ファイルを作成してくれない。
なので、AdoDbUtil オブジェクトに createMdb() を定義してあるのでこれを使う。

C:\Temp\db>cscript //nologo adosql.js .
? !AdoDbUtil
[object Object]
? !AdoDbUtil.createMdb('db3.mdb')
? $cmd /c dir db3.mdb
 ドライブ C のボリューム ラベルがありません。
 ボリューム シリアル番号は 4C18-D6C3 です

 C:\Temp\db のディレクトリ

2009/06/15  17:55            65,536 db3.mdb
               1 個のファイル              65,536 バイト
               0 個のディレクトリ   6,996,807,680 バイトの空き領域
? exit
C:\Temp\db>cscript //nologo adosql.js db3.mdb
? create table tbl3 (name varchar, age integer)
? insert into tbl3 values('Taro', 28)
? insert into tbl3 values('Jiro', 25)
? insert into tbl3 values('Sabu', 21)
? delete from tbl3
? $cmd /c dir db3.mdb
 ドライブ C のボリューム ラベルがありません。
 ボリューム シリアル番号は 4C18-D6C3 です

 C:\Temp\db のディレクトリ

2009/06/15  17:58            77,824 db3.mdb
               1 個のファイル              77,824 バイト
               0 個のディレクトリ   6,996,791,296 バイトの空き領域
? quit

ついでに mdb を圧縮する compactMdb() も定義してある。

C:\Temp\db>cscript //nologo adosql.js .
? !AdoDbUtil.compactMdb('db3.mdb')
? $cmd /c dir db3.mdb
 ドライブ C のボリューム ラベルがありません。
 ボリューム シリアル番号は 4C18-D6C3 です

 C:\Temp\db のディレクトリ

2009/06/15  17:59            73,728 db3.mdb
               1 個のファイル              73,728 バイト
               0 個のディレクトリ   6,996,795,392 バイトの空き領域
? quit