我有大约 200 个 SQLite 数据库副本。所有这些都是在不同时间拍摄的,其中包含不同的数据。一些行被删除,一些被添加。它们都在一个目录中。
我想合并表 my_table
中的所有行,使用目录中的所有 .db
文件。我想删除重复的行,显示所有数据库中的所有内容,只显示一次。
我想用纯 SQL 来做这件事,但我认为这不可能,所以我们也可以使用 Python。
表定义:
CREATE TABLE my_table (
ROWID INTEGER PRIMARY KEY AUTOINCREMENT,
guid TEXT UNIQUE NOT NULL,
text TEXT,
replace INTEGER DEFAULT 0,
service_center TEXT,
handle_id INTEGER DEFAULT 0,
subject TEXT,
country TEXT,
attributedBody BLOB,
version INTEGER DEFAULT 0,
type INTEGER DEFAULT 0,
service TEXT,
account TEXT,
account_guid TEXT,
error INTEGER DEFAULT 0,
date INTEGER,
date_read INTEGER,
date_delivered INTEGER,
is_delivered INTEGER DEFAULT 0,
is_finished INTEGER DEFAULT 0,
is_emote INTEGER DEFAULT 0,
is_from_me INTEGER DEFAULT 0,
is_empty INTEGER DEFAULT 0,
is_delayed INTEGER DEFAULT 0,
is_auto_reply INTEGER DEFAULT 0,
is_prepared INTEGER DEFAULT 0,
is_read INTEGER DEFAULT 0,
is_system_message INTEGER DEFAULT 0,
is_sent INTEGER DEFAULT 0,
has_dd_results INTEGER DEFAULT 0,
is_service_message INTEGER DEFAULT 0,
is_forward INTEGER DEFAULT 0,
was_downgraded INTEGER DEFAULT 0,
is_archive INTEGER DEFAULT 0,
cache_has_attachments INTEGER DEFAULT 0,
cache_roomnames TEXT,
was_data_detected INTEGER DEFAULT 0,
was_deduplicated INTEGER DEFAULT 0,
is_audio_message INTEGER DEFAULT 0,
is_played INTEGER DEFAULT 0,
date_played INTEGER,
item_type INTEGER DEFAULT 0,
other_handle INTEGER DEFAULT -1,
group_title TEXT,
group_action_type INTEGER DEFAULT 0,
share_status INTEGER,
share_direction INTEGER,
is_expirable INTEGER DEFAULT 0,
expire_state INTEGER DEFAULT 0,
message_action_type INTEGER DEFAULT 0,
message_source INTEGER DEFAULT 0
)
最佳答案
要能够同时访问主数据库和快照,请使用 ATTACH . 要删除一行的旧版本,请使用 INSERT OR REPLACE :
ATTACH 'snapshot123.db' AS snapshot;
INSERT OR REPLACE INTO main.my_table SELECT * FROM snapshot.my_table;
DETACH snapshot;
按照从旧到新的顺序对所有数据库执行此操作。 (SQLite 对此没有循环控制机制;在 Python 中执行此循环。)
或者,您可以倒退,从最新的和最旧的开始,只插入尚不存在的行:
ATTACH 'snapshot123.db' AS snapshot;
INSERT OR IGNORE INTO main.my_table SELECT * FROM snapshot.my_table;
DETACH snapshot;
关于python - 将同一表架构的多个备份合并到 1 个主表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34844602/