python - 将同一表架构的多个备份合并到 1 个主表中

标签 python sql sqlite

我有大约 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/

相关文章:

android - 在适配器类中保存 ImageButton 状态

sqlite - Sqlite 服务器中的 DateAdd 函数,以列名作为输入

python - 使用 Python/PhantomJS/Selenium 滚动无限页面

Python 分析器 Statprof 多次出现相同的过程

SQL Server - 在多线程应用程序中使用 @@ROWCOUNT 安全吗?

php - 从数据库中的两个表获取信息,其中 id 与数组匹配?

asp.net - 如何从 asp 网站管理工具启用角色管理器

python - 如何将一个大的Python对象分割成更小的 block

python - 使用数据库信息创建 Bokeh 时间序列图

android - 在 sqlite 数据库更改时自动刷新 ListView - Android 聊天应用程序