.output
したコマンドを.read
する。
成果物
方法
.output ./command.sql select '(実行したいドットコマンドやSQL文テキスト)'; .output stdout .read ./command.sql
これが最も自在にコマンドを動的生成・実行できる方法と思われる。たとえば前回のような使い方がある。
動的コマンド実行は以下コマンドを併用することで実現する。
コマンド | 概要 |
---|---|
.output /.read |
コマンド文字列を動的に作成する/ファイル読込してコマンドを実行する |
SQL文,DotCommand | SQLite3内の変数を取得・設定する |
fsdir() ,readfile() ,writefile() char(10) ,rtrim('',x'0A') |
ファイル・SQL間インタフェース |
.parameter (sqlite_parameters 表) |
変数をSQL内に埋め込む |
.shell |
OS・SQLite3間インタフェース |
動的コマンド作成
コマンドやSQL文の実行結果を変数として、そのままファイル出力したり.param set
したりする。それが動的コマンドのキモ。select
文やvalues()
文、.print
を使う。ただし.shell echo
などで出力するときは.output
でなくシェルのリダイレクトを使う。.shell echo 'A\\\nB' > ./output.txt
。
なお、SQL文中でファイルの入出力はfsdir()
, readfile()
, writefile()
で行う。読込後のデータにはなぜか末尾に\n
が付与されてしまうためrtrim(readfile(), x'0A')
とすることで省く。
例
シェルコマンドの結果をテーブルに挿入する
.param init .shell echo 'A\\\nB' > ./output.txt insert or replace into sqlite_parameters values('output', rtrim(cast(readfile('./output.txt') as text), x'0A')); select * from sqlite_parameters;
本当は
./output.txt
も変数にしたいができない。
それ自体も動的コマンドにするためにファイル出力するならば、そのファイルパスは固定で必要。どこまでいっても必ず固定ファイルパスが必要。
かといって、以下のようにドットコマンド内でパラメータを参照することはできない。@path
という名前のファイルが作成されてしまう。
.param init .param set @path './output.txt' .shell echo 'A\\\nB' > @path
また、ドットコマンド内でシェル変数・環境変数を参照することもできない。.shell
コマンド完了後にプロセス終了して変数が解放されるのだろう。
.param init .shell OUT_PATH='./output.txt' .shell echo 'A\\\nB' > $OUT_PATH
sh: 1: cannot create : Directory nonexistent System command returns 512
絶対パスで指定しても同じ。
.param init .shell OUT_PATH='/tmp/work/output.txt' .shell echo 'A\\\nB' > $OUT_PATH
sh: 1: cannot create : Directory nonexistent System command returns 512
ドットコマンドの結果を別のドットコマンドの一部にして実行する
及ばない方法
以下コマンドは単独では限定的な動的コマンド実行しかできない。コマンドを文字列にして.read
することで動的実行できる。
他の方法 | できる/できない |
---|---|
.parameter |
SQL文のみ。しかもwhere 句の列にセットする値などごく一部のみ。 |
.shell |
シェルコマンドのみ。プロセス内反映不可(pragma foreign_keys=? 等)。同SQLite3対話モード文脈内でドットコマンドを動的に生成・実行不可 |
対象環境
- Raspbierry pi 3 Model B+
- Raspbian stretch 9.0 2018-11-13
- bash 4.4.12(1)-release
- SQLite 3.29.0
- MeCab 0.996ユーザ辞書
$ uname -a Linux raspberrypi 4.19.42-v7+ #1218 SMP Tue May 14 00:48:17 BST 2019 armv7l GNU/Linux
前回まで
- SQLite3学習 俯瞰まとめ
- SQLite3学習 環境構築まとめ
- SQLite3学習 インタフェースまとめ(C言語、CLI、対話モード、Tcl...)
- SQLite3学習 ドットコマンドまとめ
- SQLite3学習 JSON拡張まとめ
- SQLite3学習 FTSまとめ(ICU, MeCab)
- SQLite3学習 再帰クエリ(WITH RECURSIVE)
- SQLite3学習 R-Treeモジュール
- SQLite3学習 Geopoly(2次元ベクタ画像の生成)
- SQLite3学習 拡張関数(generate_series)
- SQLite3学習 拡張ライブラリ数学関数(extension-functions.c)
- SQLite3学習 謎と名前
- SQL構文 alter(rename)
- SQL構文 alter(add column)概要
- SQL構文 alter(add column)制約
- SQL構文 alter(add column)sqlite_master変更しても反映されない
- SQL構文 alter(add column)スキーマ再定義(テーブル再作成による定義変更)