3

SQLite db ファイルを異なるテーブルとマージする安価で高速な方法はありますか?

例えば:

  • a.dbテーブルしかないa
  • b.dbテーブルしかないb
  • ...

これらを、すべてのテーブル、、、およびをabcd.db含むにマージしたいと考えています。abcd

私が欲しいのはそのような魔法のスクリプトだと思います:

merge_script a.db b.db c.db d.db -o abcd.db

このヒントと別のヒント、およびすべてのレコードを「メイン」データベースに挿入する ATTACH トリックに気付きましたが、「メイン」データベースにテーブルがないときにこれを行うことはできますか?

アップデート

SQLIte データベース ファイルを単純なストレージ コンテナーとして使用します。

ほとんどの場合、各タイプのデータ (テーブル名によって異なります) を 1 つのファイルに格納してから、それらを「ターゲット」データベースにマージします。

ただし、同じテーブル名にする必要があるデータの種類がいくつかあります。使用sqlite3 .dumpすると、テーブル名に競合が発生します。

ただし、.dumpアプローチは非常に単純です。いくつかの回避策を実行して使用します。

4

1 に答える 1

6

ダンプして復元するだけです:

for db in a, b, c, d; { sqlite3 ${db}.db .dump | sqlite3 abcd.db }

[アップデート]

別の質問ですが、テーブルがすべて一意でなく、コンテンツをマージしたい場合の簡単な修正はありますか? tdihp

これは少し広すぎる質問です。たとえば、主キーの違反をどうしますか? エラー状態に対処するために、Python などのスクリプト言語を使用してこれを行います (この種の処理には sqlalchemy.SqlSoup が適しています)。

そうは言っても、テーブルが既に存在し、一意の制約がないことがわかっている場合は、destinationtablename と sourcetablename が同じ構造を持っていると仮定して、アドホックな bash スタントでうまくいく可能性があります。

$ ( echo '.mode insert destinationtablename'
    echo 'select * from sourcetablename;' 
  ) |  sqlite3 -batch -init - source.db \
    |  sqlite3 -batch destination.db

このサイトでは、長いコメント スレッドが無礼と見なされることに気付いていないかもしれません。代わりに、質問を更新することをお勧めします。より良い質問は:

  • 今後、他のユーザーが同様の質問をするのを助ける
  • 特権を与える評判ポイントを獲得します (ポイントは後で報奨金にも使用できます)
于 2012-07-31T05:49:08.920 に答える