データベースの一部のSQLite3テーブル(すべてのテーブルではない)のデータ(スキーマではなく)のみをダンプするにはどうすればよいですか?後でデータベースに簡単に再入力でき、コマンドラインから実行する必要があるため、ダンプはSQL形式である必要があります。何かのようなもの
sqlite3 db .dump
ただし、スキーマをダンプしたり、ダンプするテーブルを選択したりする必要はありません。
データベースの一部の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;
別の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;
これがお役に立てば幸いです。
sqlite3 some.db < data.sql
sqlite3 storage/db/jobs.s3db .schema jobs > schema.sql
うまくいかないが、echo '.schema' jobs | sqlite3 storage/db/jobs.s3db > schema.sql
うまくいく
);
、のみを含む行があり、grepにオプションを);
追加する-x
ことを含むすべての行がgrepによって削除されます。この問題は、grepに追加すると解決します。
最善の方法ではありませんが、少なくとも外部ツールは必要ありません(とにかく* nixボックスに標準であるgrepを除く)。
sqlite3 database.db3 .dump | grep '^INSERT INTO "tablename"'
ただし、探しているテーブルごとにこのコマンドを実行する必要があります。
これにはスキーマが含まれないことに注意してください。
sqlite3 Database.s3db .dump
grep -v '^CREATE'
他の回答の1つで提案されているように使用する
grep -v '^CREATE;
場合(使用すると改行される場合)は、CREATE
改行されます。IMOの最善の方法は、CREATE
ステートメントを自動的に取り除くのではなく、手動で編集することです。必要なテキストエディターを使用して、CREATE
それらのステートメントを検索し、手動で削除してください。データベースが巨大でない限り(そして、あなたがsqliteを使用しているので、それは注記だと思います)、これはかなり単純です。
grepを使用してCREATE
行を除外したりINSERT
、sqlite3 $DB .dump
出力から行を取得したりすることを示唆する回答は、すべて失敗します。CREATE TABLE
コマンドは1行につき1つの列を一覧表示する(除くのでCREATE
、それのすべてを取得することはできません)、そして上の値INSERT
(あなただけつかむことができないので、行が埋め込まれた改行を持つことができますINSERT
ライン)。
for t in $(sqlite3 $DB .tables); do
echo -e ".mode insert $t\nselect * from $t;"
done | sqlite3 $DB > backup.sql
sqlite3バージョン3.6.20でテスト済み。
特定のテーブルを除外する場合は$(sqlite $DB .tables | grep -v -e one -e two -e three)
、それらをでフィルタリングできます。または、特定のサブセットを取得する場合は、それをで置き換えone two three
ます。
ポール・イーガンの答えの改善として、これは次のようにして達成できます。
sqlite3 database.db3 '.dump "table1" "table2"' | grep '^INSERT'
-または-
sqlite3 database.db3 '.dump "table1" "table2"' | grep -v '^CREATE'
もちろん、注意点は、grepをインストールする必要があることです。
cat database.sql | grep '^INSERT' > database_inserts.sql
します(スキーマと同じ、次のものに置き換えますgrep '^CREATE'
grep '^INSERT' < database.sql > database_inserts.sql
それcat
が不必要であることを意味します
cat
基本的に実行するためには何も費用はかかりませんし、入力から出力への連鎖がより明確になります。もちろん、書き込むこともできます< database.sql grep '^INSERT' ...
が、明示的なパイプの方がはるかに読みやすくなります。
Python、Java、または高水準言語では、.dumpは機能しません。CSVへの変換を手動でコーディングする必要があります。Pythonの例を示します。その他、例をいただければ幸いです。
from os import path
import csv
def convert_to_csv(directory, db_name):
conn = sqlite3.connect(path.join(directory, db_name + '.db'))
cursor = conn.cursor()
cursor.execute("SELECT name FROM sqlite_master WHERE type='table';")
tables = cursor.fetchall()
for table in tables:
table = table[0]
cursor.execute('SELECT * FROM ' + table)
column_names = [column_name[0] for column_name in cursor.description]
with open(path.join(directory, table + '.csv'), 'w') as csv_file:
csv_writer = csv.writer(csv_file)
csv_writer.writerow(column_names)
while True:
try:
csv_writer.writerow(cursor.fetchone())
except csv.Error:
break
「パネルデータがある場合、つまり、idを持つ多くの個々のエントリは、これをwith lookに追加し、要約統計もダンプします。
if 'id' in column_names:
with open(path.join(directory, table + '_aggregate.csv'), 'w') as csv_file:
csv_writer = csv.writer(csv_file)
column_names.remove('id')
column_names.remove('round')
sum_string = ','.join('sum(%s)' % item for item in column_names)
cursor.execute('SELECT round, ' + sum_string +' FROM ' + table + ' GROUP BY round;')
csv_writer.writerow(['round'] + column_names)
while True:
try:
csv_writer.writerow(cursor.fetchone())
except csv.Error:
break
SQLiteのコマンドラインシェルのドキュメントによると、SQLite のSQLiteテーブル(またはテーブルの一部)をCSVとしてエクスポートするには、「モード」を「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の場合)実際のコード
そのシェルを使用してスキーマの一部をコメント化し、それを使用することもできます。
INSERTのみを含める
sqlite3 database.db3 .dump | grep '^INSERT INTO "tablename"'
実装は簡単ですが、列に新しい行が含まれていると失敗します
SQLite挿入モード
for t in $(sqlite3 $DB .tables); do
echo -e ".mode insert $t\nselect * from $t;"
done | sqlite3 $DB > backup.sql
これは優れたカスタマイズ可能なソリューションですが、列に 'Geometry'タイプのようなBLOBオブジェクトが含まれる場合は機能しません
ダンプをスキーマと比較する
sqlite3 some.db .schema > schema.sql
sqlite3 some.db .dump > dump.sql
grep -v -f schema.sql dump > data.sql
理由はわからないが、うまくいかない
おそらくこの質問に対する最良の答えはありませんが、私にとってうまくいったのは、このような式で列値の新しい行であることを考慮に入れて挿入をgrepすることです
grep -Pzo "(?s)^INSERT.*\);[ \t]*$"
ダンプするテーブルを選択するには.dump
、テーブル名と一致するようにLIKE引数を許可しますが、これで十分でない場合は、おそらく単純なスクリプトがより良いオプションです。
TABLES='table1 table2 table3'
echo '' > /tmp/backup.sql
for t in $TABLES ; do
echo -e ".dump ${t}" | sqlite3 database.db3 | grep -Pzo "(?s)^INSERT.*?\);$" >> /tmp/backup.sql
done
または、外部キーを尊重し、すべてのダンプを1つのトランザクションのみにカプセル化するようにさらに工夫されたもの
TABLES='table1 table2 table3'
echo 'BEGIN TRANSACTION;' > /tmp/backup.sql
echo '' >> /tmp/backup.sql
for t in $TABLES ; do
echo -e ".dump ${t}" | sqlite3 $1 | grep -Pzo "(?s)^INSERT.*?\);$" | grep -v -e 'PRAGMA foreign_keys=OFF;' -e 'BEGIN TRANSACTION;' -e 'COMMIT;' >> /tmp/backup.sql
done
echo '' >> /tmp/backup.sql
echo 'COMMIT;' >> /tmp/backup.sql
);
いずれかの列に文字列が存在する場合、grep式は失敗することを考慮してください
それを復元するには(テーブルが既に作成されているデータベース内)
sqlite3 -bail database.db3 < /tmp/backup.sql
retracileによる答えは最も近いはずですが、私の場合はうまくいきません。1つの挿入クエリが途中で途切れ、エクスポートが停止しました。理由がわからない。ただし、の間は正常に動作し.dump
ます。
最後に、以下から生成されたSQLを分割するためのツールを作成しました.dump
。
各フィールドの後にカンマを挿入してテーブルを選択し、csvを生成するか、GUIツールを使用してすべてのデータを返し、csvに保存できます。