himorogiの日記

主にプログラミングに関することなど。少々ハード(電子工作)についても。

実践

SQL コマンドファイルの作成

sampleSQLcmd.txt の内容
sqliteではカラム名に日本語などを含む場合はsingle-quote (')で囲う。

CREATE TABLE list ( id, title );
INSERT INTO list ( id, title ) values( 1, '天上天下唯我独尊' );
INSERT INTO list ( id, title ) values( 2, '有朋自遠方来不亦楽乎' );
INSERT INTO list ( id, title ) values( 3, '国破山河在城春草木深' );
SELECT * FROM list;

まずPowerShell consoleのコードページをUTF-8に設定

UTF-8にしたのは、Webでは一般的だから…くらいの意味しかない。

PS C:\Users\hoge\Desktop\dbtoolWithSQLite3> chcp 65001
Active code page: 65001

PowerShellのconsoleからSQLite3の.readコマンドをSQLite3に渡して実行

PS C:\Users\hoge\Desktop\dbtoolWithSQLite3> ".read ./sampleSQLcmd.txt" | ./sqlite3.exe ./sample
1|天上天下唯我独尊
2|有朋自遠方来不亦楽乎
3|国破山河在城春草木深

PowerShellのconsoleからsqlコマンドを直接渡すこともできる

PS C:\Users\hoge\Desktop\dbtoolWithSQLite3> ./sqlite3.exe ./sample "SELECT * FROM list"
1|天上天下唯我独尊
2|有朋自遠方来不亦楽乎
3|国破山河在城春草木深

sqliteの外部スクリプトではなくPowerShellスクリプトの中でsqlコマンドをヒアドキュメントで渡してみた

SQLiteViaConsole.ps1 の内容

chcp 65001
$cmd = @"
CREATE TABLE list ( id, title );
INSERT INTO list ( id, title ) values( 1, '天上天下唯我独尊' );
INSERT INTO list ( id, title ) values( 2, '有朋自遠方来不亦楽乎' );
INSERT INTO list ( id, title ) values( 3, '国破山河在城春草木深' );
SELECT * FROM list;
"@

./sqlite3.exe ./sample2 $cmd

実行結果

PS C:\Users\hoge\Desktop\dbtoolWithSQLite3> C:\Users\hoge\Desktop\dbtoolWithSQLite3\SQLiteViaConsole.ps1
Active code page: 65001
1|�V��V���B��Ƒ�
2|�L�����������s���y��
3|���j�R�͍ݏ�t���ؐ[

…文字化けしている
.ps1ファイルをサクラエディタで開き、ファイルタイプを確認したら、[UniBE BOM付き]となっていたため、UTF16BE <-> UTF8 の問題か?

code pageをUTF16BEにしてみる

SQLiteViaConsole+.ps1 の内容

chcp 1201

$cmd = @"
CREATE TABLE list ( id, title );
INSERT INTO list ( id, title ) values( 1, '天上天下唯我独尊' );
INSERT INTO list ( id, title ) values( 2, '有朋自遠方来不亦楽乎' );
INSERT INTO list ( id, title ) values( 3, '国破山河在城春草木深' );
SELECT * FROM list;
"@

./sqlite3.exe ./sample3 $cmd

実行結果

PS C:\Users\hoge\Desktop\dbtoolWithSQLite3> C:\Users\hoge\Desktop\dbtoolWithSQLite3\SQLiteViaConsole+.ps1
chcp.com : 無効なコード ページです
発生場所 C:\Users\hoge\Desktop\dbtoolWithSQLite3\SQLiteViaConsole+.ps1:1 文字:5
+ chcp <<<<  1201
    + CategoryInfo          : NotSpecified: (無効なコード ページです:String) []、RemoteException
    + FullyQualifiedErrorId : NativeCommandError
 
1|天上天下唯我独尊
2|有朋自遠方来不亦楽乎
3|国破山河在城春草木深

エラーは帰ってくるが、表示は正常…結果オーライ?
多分chcpではなくconsoleのencoding指定をやればいいと思うのだが、今日のところはこれまで。
まぁ、PowerShell scriptの中でsqliteコマンドを書き込むのは、ちょっとした実験をやりたいときだけだと思うので、無理して使う必要は無さそう。

System.Data.SQLiteがあるのになぜわざわざSQLitePowerShellのconsoleからコマンド渡しするのかというと…

  1. System.Data.SQLite経由でのSQLiteのドットコマンドの渡し方がわからなかった
  2. (DWH から持ってきた)カラム数とレコード数の大きなデータファイルを、INSERT INTO …で1レコード毎にちまちま渡すより.importコマンドでさらっと読み込みかった

後者のうち、煩雑さという意味では昨日のSystem.Data.SQLite版のsample codeと見比べてもらえば一目瞭然だし、またパフォーマンスという意味ではODBC driver版でも同じことだと思う。
なので、Shell版のSQLitePowerShell consoleからちゃんと使えるようにしたい。
もしかしたらSystem.Data.SQLiteならではのうまいやり方が、他にあるのかもしれないけど…