我有3个SQLite DB,每个都有与表结构完全相同的7个表组.[它们是来自3种不同机器的日志转储].
我想将它们组合成一个SQLite DB,具有相同的7个表,但每个表应该具有来自所有三个DB的组合数据.因为我想在其中的3个中运行查询.什么是最好,最快的方法.
我想合并SQLite数据库,有些可能在内存中.我通过将数据库路径指定为来创建内存数据库:memory:.在这篇文章之后,使用attachSQLite 的功能似乎是一种简单而有效的方法.但是如何指定我的内存数据库作为附加源?
例如,我想做类似的事情:
c1 = sqlite3.connect(":memory:")
c1.execute(...create table, insert a bunch, commit...)
c2 = sqlite3.connect(":memory:")
c2.execute("""
ATTACH ? AS ToMerge;
BEGIN;
INSERT INTO Records SELECT * FROM ToMerge.Records;
COMMIT;
""", (c1.get_attach_id(), ))
Run Code Online (Sandbox Code Playgroud)
但是,当然,这c1.get_attach_id()是我为演示目的而制作的一种方法,因为使用字符串:memory:会很模糊.如何指定现有c1数据库?
顺序如下.假设我要合并a.db和b.db. 在命令行中,我执行以下操作.
它运作良好,但在引用的网站中,提问者询问加速,答案是使用'begin'和'commit'命令.
然后,我想出了以下python代码来完成同样的事情.我用SQLiteDB抽象SQLite函数调用,其中一个方法是runCommand().即使我删除了self.connector.commit(),我也得到了同样的错误.
# run command
def runCommand(self, command):
self.cursor.execute(command)
self.connector.commit() # same error even though I delete this line
db = SQLiteDB('a.db')
cmd = "attach \"%s\" as toMerge" % "b.db"
print cmd
db.runCommand(cmd)
cmd = "begin"
db.runCommand(cmd)
cmd = "insert into benchmark select * from toMerge.benchmark"
db.runCommand(cmd)
cmd = "commit"
db.runCommand(cmd)
cmd = "detach database toMerge"
db.runCommand(cmd)
Run Code Online (Sandbox Code Playgroud)
但是,我收到以下错误.
OperationalError: cannot commit - …Run Code Online (Sandbox Code Playgroud) 提供了两种解决方案(请参阅底部的链接),但都在我尝试执行的操作中失败:
--------------
| id | name |
--------------
| 1 | Apple |
| 2 | Lemon |
| 3 | Kiwi |
| 4 | Banana|
--------------
Run Code Online (Sandbox Code Playgroud)
果汁
----------------
| id | name |
----------------
| 1 | Juice A |
| 2 | Juice B |
----------------
Run Code Online (Sandbox Code Playgroud)
配方(接线台)
----------------------------
| id | juice_id | fruit_id |
----------------------------
| 1 | 1 | 1 |
| 2 | 1 | 2 |
| 3 | …Run Code Online (Sandbox Code Playgroud) 我有多个数据库文件,它们存在于多个位置,结构完全相同.我理解attach函数可以用于将多个文件连接到一个数据库连接,但是,它将它们视为单独的数据库.我想做的事情如下:
SELECT uid, name FROM ALL_DATABASES.Users;
Run Code Online (Sandbox Code Playgroud)
也,
SELECT uid, name FROM DB1.Users UNION SELECT uid, name FROM DB2.Users ;
Run Code Online (Sandbox Code Playgroud)
不是一个有效的答案,因为我需要合并任意数量的数据库文件.最后,数据库文件必须保持独立.有谁知道怎么做到这一点?
编辑:一个答案给了我一个想法:是否可以创建一个视图,它是所有不同表的组合?是否可以查询所有数据库文件以及它们"挂载"的数据库,然后在视图查询中使用它来创建"主表"?
是否有一种廉价/快速的方法将SQLite数据库文件与不同的表合并?
例如:
a.db 只有桌子 ab.db 只有桌子 b我想这些合并成一个abcd.db包含所有表a,b,c,和d.
我想我想要的是这样一个神奇的剧本:
merge_script a.db b.db c.db d.db -o abcd.db
Run Code Online (Sandbox Code Playgroud)
我已经注意到这个提示和另一个技巧和ATTACH技巧,它将所有记录插入"主"数据库,但是我可以在"主"数据库中没有表时执行此操作吗?
UPDATE
我使用SQLIte数据库文件作为简单的存储容器.
在大多数情况下,我将每种类型的数据(不同于表名)存储在一个文件中,然后将它们合并到"目标"数据库中.
但是有些类型的数据应该在同一个表名中.如果使用sqlite3 .dump,那么tablename就会发生冲突.
然而,这种.dump方法非常简单,我只是做一些解决方法并使用它.