TOP

データベースsqlite3 その11

コマンドライン操作と管理作業

管理作業

sqlite3のコマンドラインインターフェース(CLI)操作は、sqlite3.exeの引数としたものと、ドットコマンドによるものとがあり ます。操作については、その3や、それ以降の章の中で、説明しております。もう少し、実務に役立ちそうなコマンドについて取り上げてみたいと思います。

ここでは、region.sq3というデータベースとmy_db.sq3というデータベースについて操作題材としてとりあげてみることにします。 region.sq3の中には、地域をコード化したkanto_regionテーブルがあり、my_db.sq3では、my_friendテーブルが前者 を利用とするテーブル間の構図を想定しております。

sqlite3の起動

sqlite3.exe に引数を何もつけない場合

データベースをメモリー内で保存・操作します。

.shell CMD ARGS...       Run CMD ARGS... in a system shell
                           シェルコマンドを実行する。
.save FILE               Write in-memory database into FILE
                            インメモリーデータベースを指定ファイルに書き出す。
.open ?OPTIONS? ?FILE?   Close existing database and reopen FILE

        カレントデータベースを閉じて、指定ファイルをオープンする。
     Options:
        --append        Use appendvfs to append database to the end of FILE
        --new           Initialize FILE to an empty database
        --nofollow      Do not follow symbolic links
        --readonly      Open FILE readonly
        --zip           FILE is a ZIP archive

sqlite3.exe の引数にデータベース名を指定する

データベースファイル名を指定するとデータベースファイルが読み出される。データベースファイルが存在しない場合は新規に作成される。

sqlite3.exe を インメモリーで開く

データベースをメモリー内で保存・操作します。

複数のデータベースファイルを操作する

ATTACH DATABASE 'DatabaseName' As 'Alias-Name';
ATTACH 複数のデータベースを利用する場合、使用するデータベースを選択する
存在しないDatabaseName の場合は、作成される
DETACH DATABASE 'Alias-Name'; 
データベースの接続を切断する

region.sq3 データベースファイルを作成する

アタッチステートメントでmy_db.sq3データベースを作成する

外部キー制約は使えない

region.sql3 と my_db.sq3 のテーブル間で内部結合をする

.explain ?on|off|auto?
   Change the EXPLAIN formatting mode.  Default: auto
   フォーマットモードの設定。デフォルトではheader=off colseparator: "|"
rowseparator: "\n"となる。on セットにすると .mode column と同じ画面表示設定になるようである。

出力先を変える操作

ドットコマンドの操作結果は、デフォルトでは、画面になっております。これを、ファイル出力に変えることにより、他のアプリケーションで利用したり、再度取り込んだりすることが可能になります。

.output ?FILE?           Send output to FILE or stdout if FILE is omitted
                 sqlite3ドットコマンドの操作結果を、指定ファイルに書き込む。
                 ファイル名が存在しない場合は、新たに生成される。
   If FILE begins with '|' then open it as a pipe.
   Options:
     --bom                 Prefix output with a UTF8 byte-order mark
     -e                    Send output to the system text editor
     -x                    Send output as CSV to a spreadsheet
.once ?OPTIONS? ?FILE?   Output for the next SQL command only to FILE
                  sqlite3ドットコマンドの操作結果を、指定ファイルに書き込む。
                  但し、書込み操作後は、出力先がデフォルト(画面)に戻る。
                  ファイル名が存在しない場合は、新たに生成される。     
     If FILE begins with '|' then open as a pipe
       --bom  Put a UTF8 byte-order mark at the beginning
       -e     Send output to the system text editor
       -x     Send output as CSV to a spreadsheet (same as ".excel")

CSVファイルとしてファイル出力する

region.sq3データベースのkanto_regionテーブルに格納されているレコードを出力してみます。

CSVファイルをデータベーステーブルのレコードとして取り込む

フォーマット形式ファイルとして出力できるもの

下記のようなモード設定をすれば、そのモード形式のファイルとして出力できます。

.mode MODE ?TABLE?       Set output mode
   MODE is one of:
     ascii     Columns/rows delimited by 0x1F and 0x1E
     box       Tables using unicode box-drawing characters
     csv       Comma-separated values
     column    Output in columns.  (See .width)
     html      HTML <table> code
     insert    SQL insert statements for TABLE
     json      Results in a JSON array
     line      One value per line
     list      Values delimited by "|"
     markdown  Markdown table format
     quote     Escape answers as for SQL
     table     ASCII-art table
     tabs      Tab-separated values
     tcl       TCL list elements
.show                    Show the current values for various settings
        表示に係わる項目の設定値を表示する

データベースファイルの再構築

複数のデータベースをアタッチ接続しても、外部キー制約が使えません。外部キーの親キーが変更されても、異なるデータベースが、その外部キーをもっ ていても変更が反映されないことになります。親キーとなる、異なるデータベースをその外部キーを持つデータベースにまとめてしまえば、外部キー制約を使う ことが出来ます。但し、親キーの変更は、どこかの時点で、そのことを感知し、その都度、親キーをもつテーブルを取り込む必要があります。このようなことが あるので、親キーを持つテーブルは頻繁に更新しないデータであるのが望ましいと思われます。

.dump ?TABLE?            Render database content as SQL

                    データベースの指定テーブルの内容を SQL 文の形式で出力
   Options:
     --data-only            Output only INSERT statements
     --newlines             Allow unescaped newline characters in output
     --nosys                Omit system tables (ex: "sqlite_stat1")
     --preserve-rowids      Include ROWID values in the output
   TABLE is a LIKE pattern for the tables to dump
   Additional LIKE patterns can be given in subsequent arguments
.read FILE               Read input from FILE
                   ダンプした内容を読み込む

ここでは、外部キー制約を使えるように、アタッチ接続されたデータベースの親キーを持つテーブルregion.kanto_regionをメインとなるデータベースmy_dbに取り込みます。下記のような手順で行っております。

  1. regionデータベースを開きます。
  2. region.sq3データベースからkanto_regionテーブル情報をkanto_region_dump.txtとしてダンプします。
  3. regionデータベースを閉じます。
  4. 再構築先のデータベースmy_dbを開きます。
  5. my_friendテーブルのデータをファイルmy_friend_with_header.csv出力します。–> 前項で出力済み
  6. kanto_regionテーブルを親キーとする、外部キー制約列のあるnew_my_friendテーブルを生成します。
  7. my_friendテーブルのデータmy_friend_with_header.csvをmy_dbデータベースのnew_my_friendテーブルにインポートします。
  8. ダンプ出力されたkanto_regionテーブル情報ファイルkanto_region_dump.txtをmy_dbデータベースに取り込みます。
  9. 外部キーを有効にします。
  10. my_friendテーブルを削除します。

データベース ファイル構造のクリーンアップ VACUUMコマンド

VACUUM コマンドは、メイン データベースの内容を一時データベース ファイルにコピーし、そのコピーから元のデータベース ファイルを再ロードすることによって、メイン データベースをクリーンアップします。これにより、空き ページが削除され、テーブル データが連続するように配置され、データベース ファイル構造がコンパクトになります。

  • データベース ファイルから大量のデータが削除されると、空のスペース、つまりファイルサイズは変らず、「空き」があるデータベース ページになります。VACUUM を実行してデータベースを再構築すると、この領域が再利用され、データベース ファイルのサイズが削減されます。
  • 再構築には、一時データベースファイルにコピーできる分の空き容量が必要とされます。
  • VACUUM コマンド実行には、トランザクションの場合と同様に、ロールバック ジャーナルまたは先行書き込みログWAL ファイルが使用されます。
  • VACUUM を実行しようとしているデータベース接続上に開いているトランザクションがある場合、VACUUM は失敗します。
  • VACUUM コマンドは、明示的な INTEGER PRIMARY KEY を持たないテーブル内のエントリの ROWID を変更する場合があります。

VACUUMコマンドでクリーンアップしてみる

コマンドプロンプトから
$sqlite3 database_name "VACUUM;"
SQLiteプロンプトから
sqlite> VACUUM;
sqlite> VACUUM table_name;
VACUUM database_name/table_name INTO filename
元のデータベース ファイルは変更されず、INTO 句の引数で指定されたファイルに新しいデータベースが作成されます。
ライブ データベースのバックアップ コピーを生成するためのバックアップ APIの代替手段となります。
ファイルは、空のファイルである必要があります。

自動バキューム

自動バキュームは、空きページをデータベースの最後に移動し、データベースのサイズを縮小させるのをプラグマ設定で行います。

sqlite> pragma auto_vacuum;  -- デフォルト 0
 自動バキューム設定の確認
sqlite> PRAGMA auto_vacuum = NONE; -- 0
 自動バキューム モードを無効にします
sqlite> PRAGMA auto_vacuum = FULL; -- 1
 自動バキューム モードを有効にします
sqlite> PRAGMA auto_vacuum = INCREMENTAL; -- 2
 増分バキュームを有効にします。

バックアップ

.backup ?DB? FILE        Backup DB (default "main") to FILE
       --append            Use the appendvfs
       --async             Write to FILE without journal and fsync()
	   データベース ファイルに共有ロックを確立します。
.restore ?DB? FILE       Restore content of DB (default "main") from FILE
現在接続しているデータベースに含まれているテーブルやデータなどがすべて削除された上でリストアが行われます

アーカイブ

.archive ...             Manage SQL archives
                 アーカイブファイルの作成、展開
   Each command must have exactly one of the following options:
     -c, --create               Create a new archive
     -u, --update               Add or update files with changed mtime
     -i, --insert               Like -u but always add even if unchanged
     -t, --list                 List contents of archive
     -x, --extract              Extract files from archive
   Optional arguments:
     -v, --verbose              Print each filename as it is processed
     -f FILE, --file FILE       Use archive FILE (default is current db)
     -a FILE, --append FILE     Open FILE using the apndvfs VFS
     -C DIR, --directory DIR    Read/extract files from directory DIR
     -n, --dryrun               Show the SQL that would have occurred
   Examples:
     .ar -cf ARCHIVE foo bar  # Create ARCHIVE from files foo and bar
     .ar -tf ARCHIVE          # List members of ARCHIVE
     .ar -xvf ARCHIVE         # Verbosely extract files from ARCHIVE
   See also:
      http://sqlite.org/cli.html#sqlar_archive_support

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください