web-dev-qa-db-ja.com

ドットコマンドを使用したSQLiteのスクリプト

SQLiteドットコマンドを含むスクリプトを作成することは可能ですか(vis。.read file.sql; .separator ,; .import file.csv;)?

SQLiteデータベースの構築と再構築を繰り返しており、データベースを再構築するたびに約24個のドットコマンドステートメントを入力する必要があります。これらのコマンドをスクリプトに入れて、SQLiteに読み込ませることができれば、本当にすばらしいと思います。

ドットコマンド(not SQLステートメント)をスクリプトに入れてSQLiteで実行する方法はありますか?

私はMac OS Xでbashを使用しています。

9
StudentsTea

私は昨夜インターネットで答えを探しましたが何も見つかりませんでした。もちろん、今日この質問を投稿した後、私は再試行します-- そして適切な応答をほとんどすぐに見つけます。

その要点は?コマンドをテキストファイルに入れ、入力ファイル記述子を使用してそれをSQLiteに送信するか、bashスクリプトですべてをスクリプト化します。

最初の方法:

sqlite3 database.db < commands.txt

2番目の方法:

#!/bin/bash --
sqlite3 -batch $1 <<"EOF"
CREATE TABLE log_entry ( <snip> );
.separator "\t"
.import logfile.log log_entry
EOF

そして、コマンドラインで:

import.sh database.db
8
StudentsTea

別の方法として、私はより簡単だと考えていますが、.readコマンドを使用することができます。 OS(Mac OS Xのターミナル)のコマンドラインから、次のように入力します。

sqlite3 yourdatabase.db ".read script_full_of_dot_commands"

sqlite3を起動し、前述のデータベースを使用して、script_full_of_dot_commandsのすべてのコマンドを実行し、終了します。

たとえば、次のファイルがあるとします。

script_full_of_dot_commands.commandsSQL commandsの両方を含むファイル:

.read file.sql
.separator ","
.import file.csv t
.headers on
.separator "|"
SELECT name, a FROM t WHERE a < 2 ;
SELECT count(*) FROM t2;

file.sql:SQLコマンドのみを含むファイル。

DROP TABLE IF EXISTS t;
DROP TABLE IF EXISTS t2;
CREATE TABLE t (a integer PRIMARY KEY, name varchar);
CREATE TABLE t2 (b integer PRIMARY KEY);

file.csv:テーブルに入力するデータファイル

1,One
2,Two
3,Three
4,Four

実行の結果

sqlite3 yourdatabase.db ".read script_full_of_dot_commands"

です

name|a
One|1
count(*)
0

次も確認してください: コマンドラインからのSqlite3スクリプトの実行 StackOverflowから。

2
joanolo

SQLiteドットコマンドを提供するもう1つのスクリプト可能な方法:

_sqlite3 db.sqlite < <(echo -e ".read file.sql \n.separator ',' \n.import file.csv")
_

SQLコマンドを混在させることもできます。 _echo -e "…"_コマンドがSQLiteコマンドラインクライアントに書き込む方法で出力することを確認してください。

利点:

  • 追加のファイルは必要ありません。
  • _<<"EOF" … EOF_のドキュメント構文は必要ありません。動作しますが、ターミナルにコピー&ペーストするときに、複数行のシェルコマンドを使用するのは面倒です。

説明:

  • これはBashプロセス置換<(…)を使用して、ディスク上のファイルを必要とせずにファイル入力を提供します。
  • ドットコマンド間の区切り文字は、コマンドの直前の改行です。これは、ここで_echo -e "\n"_を使用して生成します。
0
tanius