加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python – 将同一表模式的多个备份合并到一个主表中

发布时间:2020-12-16 23:29:50 所属栏目:Python 来源:网络整理
导读:我有大约200个SQLite数据库副本.所有在不同的时间采用不同的数据.删除了一些行,并添加了一些行.它们都在一个目录中. 我想使用目录中的所有.db文件合并表my_table中的所有行.我希望删除重复的行,只显示所有数据库的所有内容. 我想在纯SQL中这样做,但我不认为
我有大约200个SQLite数据库副本.所有在不同的时间采用不同的数据.删除了一些行,并添加了一些行.它们都在一个目录中.

我想使用目录中的所有.db文件合并表my_table中的所有行.我希望删除重复的行,只显示所有数据库的所有内容.

我想在纯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;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读