合并所有具有不同表的SQLite数据库

3
有没有一种便宜/快速的方法来合并具有不同表的SQLite db文件?
例如:
- a.db 只有表 a - b.db 只有表 b - ...
我想将它们合并成一个包含所有表 a、b、c、d 的 abcd.db。
我认为我想要的是这样一个神奇脚本:
merge_script a.db b.db c.db d.db -o abcd.db

我注意到这个 提示 和另一个 提示 以及 ATTACH 技巧,这会将所有记录插入到“主”数据库中,但是如果“主”数据库中缺少表,我可以做到吗?

更新

我使用 SQLIte 数据库文件作为简单的存储容器。

在大多数情况下,我将每种类型的数据(由表名称区分)存储在单个文件中,然后将它们合并到“目标”数据库中。

但是,有些类型的数据应该在相同的表名中。如果使用 sqlite3 .dump,表名会出现冲突。

然而,.dump 方法非常简单,我将只需要进行一些变通就可以使用它。

1个回答

6

只需转储和恢复:

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

[更新]

另一个问题是,如果表不都是唯一的,并且我想合并内容,是否有任何快速解决方法? tdihp

这个问题有点过于宽泛。例如,如果存在主键违规,你会怎么做?我会使用一些脚本语言(比如 Python)来处理错误条件(像 sqlalchemy.SqlSoup 这样的工具非常适合此类操作)。

话虽如此,如果你知道表已经存在且没有唯一约束,则可能可以使用一些特定的 bash 技巧 - 假设目标表名和源表名具有相同的结构:

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

您可能不知道,在此网站上,长评论线程被认为是粗鲁的,相反地,我们鼓励您更新您的问题。更好的问题将会:
- 帮助其他有类似问题的用户 - 赚取声望点数,这将给您带来特权(声望点数也可以用于赏金)

@tdihp:由于没有创建临时文件,开销非常小。 - Paulo Scardine

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接