Delphi Programming / Object Pascal
サイトのトップページへ リンクのページへ ロゴマーク
[掲載 2017年02月14日] [更新 2017年02月14日] Delphi サンプルプログラム集
567_SQLite コマンドラインツール
動作確認等 Windows 7 U64(SP2) + Delphi XE(UP1) Pro
567_SQLite_CommandLine.zip [6,149 KB]  2017年02月14日版 (EXE 同梱)







SQLite コマンドラインツールの入手


SQLite のコマンドラインツールは SQLite のサイトのダウンロードページから入手できます。
今回のテストでは、sqlite-tools-win32-x86-3160200.zip をダウロードしました。


図1
SQLite-tools のダウンロード

下図は本ページで提供しているサンプルプログラムの構成です。SQLite のサイトからダウンロードした ZIP 書庫ファイルを解凍展開したファイルは、sqplite-tools というフォルダを作成して、そこに置きました。今回使用するのは sqlite3.exe だけです。

この sqlite3.exe をタプルクリック等で直接起動してもいいのですが、データベースのファイル名
を指定してコマンドプロンプトから起動した方が便利です。以下のサンプルではそうしています。



図2
ファイル構成




01_SQLite コマンドにおけるデータベースへの接続と切断


下図は、データベースのファイル名を指定して、sqlite3.exe を起動し、表の一覧を表示して、最後にその表のデータを SQL の SELECT 文で表示した結果です。
エクスプローラで sqplite-tools フォルダを開き、エクスプローラのアドレスから cmd.exe を実行してコマンドプロンプトを起動しました。その後に、以下のコマンドを対話形式 (インタラクティブな処理) で実行しています。
..\AddressBook_B.db3 は、AddressBook_B.db3 の場所を相対的に指定しています。..\ は 1 つ上の階層のフォルダを意味します。

sqlite3.exe ..\AddressBook_B.db3  //sqlite3.exe を起動しデータベースに接続
.tables                           //表の一覧を表示
select * from AddressTBL;         //SELECT文を実行してデータを表示。末尾は;
.exit                             //データベースを切断して終了

sqlite3.exe を実行すると、プロンプトが sqlite> になります。ここにコマンドや SQL文をタイプして [Enter] キーで実行します。
コマンドは先頭が . (ドット、ピリオド) です。SQL 文には . は必要ありませんが、末尾を ; (セミコロン) にします。複数行でタイプする場合は [Enter] キーで改行できます。最後に ; をタイプして [Enter] キーを押下すると入力した SQL 文が実行されます。
.exit コマンドを実行すると、データベースを切断して終了し、コマンドプロンプトに戻ります。

sqlite コマンドでは、ファイル名のパスの区切り文字 (デリミタ) として / (スラッシュ) を使用します。¥ (円記号) や \ (バックスラッシュ) を使用するとエラーになります。
sqlite のコマンドは、コマンドプロンプトのコマンドのように & で複数指定することはできません。コマンド単位での実行になります。



図3
実行結果
  • 対話形式での実行

以上のように、コマンドラインツールを対話形式で実行する場合、コマンドを記述したバッチファイルを実行しても、コマンドプロンプトが起動した後に実行されるのは最初のコマンドだけです。コマンドプロンプトを起動した後に自動的にコマンド類を実行したい場合は、次項のサンプルのように、必要なパラメータをコマンドラインの引数として設定しします。

コマンドラインツールを対話形式で実行する場合、以下のリンクのサンプルのように、コマンドを送信して実行することも可能です。






02_SQLite のコマンドを使用した CSV ファイルからのインポート


添付の AddressBook_A.db3 というデータベースの AddressTBL という表に、CSV テキストファイルからデータをインポートする例です。
以下のバッチファイルを作成して、sqlite のコマンドでこのバッチファイルを指定します。SQLite のコマンドラインでは、バッチファイルの引数の機能は利用できません。S本サンプルでは、コマンドプロンプトを非非表示で実行するようにしています。

.import コマンドは、指定した表がない場合、自動で作成されます。この時、CSV ファイルの 1 行目は項目名として扱われます。
既に表がデータベース内に存在する場合は、CSV ファイルの 1 行目もデータとして扱われます。この時、既にある表と CSV の項目数と項目名は一致していいなければなりません。また、プライマリキーの値が同じレコードのデータはインポートされません。

CSV のテキストの文字のコードページは BOM なしの UTF-8 にしておきます。そうしないと、日本語の文字が文字化けがしたり、インポートできない場合があります。BOM なしの UTF-8 を UTF-8N と書くことがあります。

CSV ファイルのデータを元に、新規に表を作成する場合は、このインポートの機能は便利です。ただし、インポートした後にプライマリキー等の設定が必要です。


.mode csv
.import CsvText.csv AddressTBL



[備考 1]
本サンプルは、日本語を含むフォルダの階層下で実行すると失敗します>


[備考 2]
このサンプルは続けて実行すると、ID 値が重複するために失敗します。インポート元の CSV ファイル内の先頭の値が ID 値です。サンプルプログラムを実行すると、この ID 値のデータがインポート先に登録されます。



図4
表の元のデータ
  • 添付の DispTableData.exe で表示した内容
図5
インポートするデータ
  • 文字のコードページは BOM なしの UTF-8 (UTF-8N) としておく
  • SQLite の日付の形式は
    yyyy-mm-dd なので、その形式にしておいた方がよい
図6
インポートの結果
  • 添付の DispTableData.exe で表示した内容

本サンプルはコマンドプロンプトを表示しないでコマンドを実行しています。したがって、エラーが発生しても検出できません。下図は、コマンドプロンプトを表示して実行した結果です。
一般的なデータベースには、SQLite のようにコマンドラインのツールが用意されています。それらのコマンドラインツールは、コマンドプロンプトを表示した状態で実行するのが一般的と思われます。



図7
コマンドプロンプトを表示した場合

リスト1
CSV ファイルからのインポート
コマンドプロンプトを非表示で実行
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ShellAPI;
type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;
var
  Form1: TForm1;

implementation

{$R *.DFM}

//=============================================================================
//  コマンドラインSQLite3.exeの使用例
//
//  CSVファイルのデータをSQLiteデータベースの表にインポート
//  重複するプライマリキーのレコードはインポートしない
//  インポート側の表がない場合は、自動で作成される
//  この場合、CSVファイルの1行目は項目名と解釈される
//  表が存在する場合は、CSVの1行目からデータとして解釈する
//
//  日本語のフォルダ名の階層下で実行すると失敗する
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
var
  LCmdFile       : string;
  LSQLiteExePath : string;
  LDBFilePath    : string;
  LCmdLineText   : string;
  LSQLTextFile   : string;
begin
  LCmdFile := 'cmd.exe';

  LSQLiteExePath := ExpandFileName('..\sqlite-tools\sqlite3.exe');
  LDBFilePath    := ExpandFileName('..\AddressBook_A.db3');
  LSQLTextFile   := ExpandFileName('cmdline.txt');

  LCmdLineText := '/c ' + LSQLiteExePath + ' ' + LDBFilePath + ' < ' + LSQLTextFile;
  ShellExecute(Handle, '', PChar(LCmdFile), PChar(LCmdLineText), nil, SW_HIDE);
end;

end.




03_SQLite のコマンドを使用した CSV ファイルへのエクスポート


添付の AddressBook_B.db3 というデータベースの AddressTBL という表のデータを、CSV テキストファイルに出力する例です。
以下のバッチファイルを作成して、sqlite のコマンドでこのバッチファイルを指定します。SQLite のコマンドラインでは、バッチファイルの引数の機能は利用できません。本サンプルでは、コマンドプロンプトを非非表示で実行するようにしています。

CSV ファイルがなければ自動で作成されます。1 行目が項目名となるように .header on コマンドを実行しています。CSV テキストの文字のコードページは BOM なしの UTF-8 になります。



.header on
.mode csv
.once Out.csv
SELECT * FROM AddressTBL;



[備考]
本サンプルは、日本語を含むフォルダの階層下で実行すると失敗します>



図8
保存された CSV ファイル
  • テキストエディタで表示
  • コードページは BOM なしの UTF-8 となる

リスト2
CSV ファイルへのエクスポート
コマンドプロンプトを非表示で実行
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ShellAPI;
type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;
var
  Form1: TForm1;

implementation

{$R *.DFM}

//=============================================================================
//  コマンドラインSQLite3.exeの使用例
//
//  SQLiteデータベースの表のデータをCSVファイルにエクスポート
//  出力先のファイルがない場合は自動で作成される
//
//  日本語のフォルダ名の階層下で実行すると失敗する
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
var
  LCmdFile       : string;
  LSQLiteExePath : string;
  LDBFilePath    : string;
  LCmdLineText   : string;
  LSQLTextFile   : string;
begin
  LCmdFile := 'cmd.exe';

  LSQLiteExePath := ExpandFileName('..\sqlite-tools\sqlite3.exe');
  LDBFilePath    := ExpandFileName('..\AddressBook_B.db3');
  LSQLTextFile   := ExpandFileName('cmdline.txt');

  LCmdLineText := '/c ' + LSQLiteExePath + ' ' + LDBFilePath + ' < ' + LSQLTextFile;
  ShellExecute(Handle, '', PChar(LCmdFile), PChar(LCmdLineText), nil, SW_HIDE);
end;

end.




04_SQLite3.exe 起動時のコマンド実行


SQLite3.exe の起動時にコマンドを 1 つだけ指定できます。SQL 文は " (ダブルクォーテーション) で括れば実行できます。
下図は、添付の AddressBook_B.db3 というデータベースで SELECT 文を実行した結果です。



[備考]
本サンプルは、日本語を含むフォルダの階層下で実行すると失敗します>



図9
実行結果

リスト3
SQLite3.exe 起動時に SQL 文を実行する例
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ShellAPI;
type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;
var
  Form1: TForm1;

implementation

{$R *.DFM}

//=============================================================================
//  コマンドラインSQLite3.exeの使用例
//
//  SQLite3.exe起動時にコマンドを実行
//  指定可能なコマンドは1つだけ
//  SQL文は"(ダブルクォーテーション)で括る
//
//  日本語のフォルダ名の階層下で実行すると失敗する
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
var
  LCmdFile       : string;
  LSQLiteExePath : string;
  LDBFilePath    : string;
  LSQLiteCmdText : string;
  LCmdLineText   : string;
begin
  LCmdFile := 'cmd.exe';

  LSQLiteExePath := ExpandFileName('..\sqlite-tools\sqlite3.exe');
  LDBFilePath    := ExpandFileName('..\AddressBook_B.db3');
  LSQLiteCmdText := '"select * from AddressTBL;"';

  LCmdLineText := '/k ' + LSQLiteExePath + ' ' + LDBFilePath + ' ' + LSQLiteCmdText;
  ShellExecute(Handle, '', PChar(LCmdFile), PChar(LCmdLineText), nil, SW_SHOWNORMAL);
end;

end.