実践
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があるのになぜわざわざSQLiteをPowerShellのconsoleからコマンド渡しするのかというと…
- System.Data.SQLite経由でのSQLiteのドットコマンドの渡し方がわからなかった
- (DWH から持ってきた)カラム数とレコード数の大きなデータファイルを、INSERT INTO …で1レコード毎にちまちま渡すより.importコマンドでさらっと読み込みかった
後者のうち、煩雑さという意味では昨日のSystem.Data.SQLite版のsample codeと見比べてもらえば一目瞭然だし、またパフォーマンスという意味ではODBC driver版でも同じことだと思う。
なので、Shell版のSQLiteをPowerShell consoleからちゃんと使えるようにしたい。
もしかしたらSystem.Data.SQLiteならではのうまいやり方が、他にあるのかもしれないけど…