データベースの一部の SQLite3 テーブル (すべてのテーブルではない) のデータをダンプし、スキーマではなくデータのみをダンプするにはどうすればよいですか? ダンプは、後でデータベースに簡単に再入力でき、コマンド ラインから実行する必要があるため、SQL 形式にする必要があります。何かのようなもの
sqlite3 db .dump
ただし、スキーマをダンプしたり、ダンプするテーブルを選択したりしません。
ダンプされたファイルで何をしたいのかを言っているのではありません。
CSV ファイルを取得するには (ほとんどすべてのものにインポートできます)
.mode csv
-- use '.separator SOME_STRING' for something other than a comma.
.headers on
.out file.csv
select * from MyTable;
SQL ファイルを取得するには (別の SQLite データベースに再挿入できます)
.mode insert <target_table_name>
.out file.sql
select * from MyTable;
.schema コマンドと .dump コマンドの違いを取得することで、これを行うことができます。たとえば、grep の場合:
sqlite3 some.db .schema > schema.sql
sqlite3 some.db .dump > dump.sql
grep -vx -f schema.sql dump.sql > data.sql
data.sql
ファイルには、次のようなスキーマのないデータのみが含まれます。
BEGIN TRANSACTION;
INSERT INTO "table1" VALUES ...;
...
INSERT INTO "table2" VALUES ...;
...
COMMIT;
これがお役に立てば幸いです。
.dump特殊コマンドに1つ以上のテーブル引数を指定できます(例:sqlite3 db ".dump 'table1' 'table2'"
。
最善の方法ではありませんが、少なくとも外部ツールは必要ありません (とにかく *nix ボックスの標準である grep を除く)
sqlite3 database.db3 .dump | grep '^INSERT INTO "tablename"'
ただし、探しているテーブルごとにこのコマンドを実行する必要があります。
これにはスキーマが含まれないことに注意してください。
Paul Egan の回答の改善として、これは次のように実現できます。
sqlite3 database.db3 '.dump "table1" "table2"' | grep '^INSERT'
- また -
sqlite3 database.db3 '.dump "table1" "table2"' | grep -v '^CREATE'
もちろん、注意点として、grep をインストールする必要があります。
Command Line Shell For SQLiteの SQLite ドキュメントによると、単に「モード」を「csv」に設定し、クエリを実行して目的の行を抽出するだけで、SQLite テーブル (またはテーブルの一部) を CSV としてエクスポートできます。テーブル:
sqlite> .header on
sqlite> .mode csv
sqlite> .once c:/work/dataout.csv
sqlite> SELECT * FROM tab1;
sqlite> .exit
次に、「.import」コマンドを使用して、CSV (カンマ区切り値) データを SQLite テーブルにインポートします。
sqlite> .mode csv
sqlite> .import C:/work/dataout.csv tab1
sqlite> .exit
考慮すべき 2 つのケースについては、詳細なドキュメントを参照してください: (1) テーブル "tab1" が以前に存在していない、および (2) テーブル "tab1" が既に存在している。
最良の方法は、スキーマ部分を除いて、sqlite3 db ダンプが実行するコードを取得することです。
疑似コードの例:
SELECT 'INSERT INTO ' || tableName || ' VALUES( ' ||
{for each value} ' quote(' || value || ')' (+ commas until final)
|| ')' FROM 'tableName' ORDER BY rowid DESC
参照: src/shell.c:838
(sqlite-3.5.9 の場合) 実際のコードについては
そのシェルを取り、スキーマ部分をコメントアウトして、それを使用することさえできます。
このバージョンは、挿入内の改行でうまく機能します:
sqlite3 database.sqlite3 .dump | grep -v '^CREATE'
CREATE
実際には、改行が含まれる可能性が低い行で始まるすべての行を除外します
各フィールドの後にコンマを挿入してテーブルを選択して csv を生成するか、GUI ツールを使用してすべてのデータを返し、それを csv に保存することができます。