我有两个数据库具有相同的模式,我想有效地做一个表上的差异。即只返回唯一记录,折扣主键。python sqlite3:两个数据库中的表的差异
columns = zip(*db1.execute("PRAGMA table_info(foo)").fetchall())[1]
db1.execute("ATTACH DATABASE '/path/to/db1.db' AS db1")
db1.execute("ATTACH DATABASE '/path/to/db2.db' AS db2")
db2.execute("ATTACH DATABASE '/path/to/db1.db' AS db1")
db2.execute("ATTACH DATABASE '/path/to/db2.db' AS db2")
data = db2.execute("""
SELECT
one.*
FROM
db1.foo AS one
JOIN db2.foo
AS two
WHERE {}
""".format(' AND '.join(['one.{0}!=two.{0}'.format(c) for c in columns[1:]]))
).fetchall()
也就是说,忽略了主键(在这种情况下meow),不回,在这两个数据库中存在相同的记录。
表foo在db1样子:
meow mix please deliver
1 123 abc
2 234 bcd two
3 345 cde
而且表foo在db2样子:
meow mix please deliver
1 345 cde
2 123 abc one
3 234 bcd two
4 456 def four
所以从db2独特的条目是:
[(2, 123, 'abc', 'one'), (4, 456, 'def', 'four')]
我i我得到了什么。如果我有两列以上,这很好用。但是,如果只有两个,即一个主键和一个值,如查找表:
bar baz bar baz
1 123 1 234
2 234 2 345
3 345 3 123
4 456
我得到重复所有非唯一值N-1次和重复的唯一值N次,其中N是记录数在db1。我明白为什么会发生这种情况,但我不知道如何解决。
[(1, '234'),
(1, '234'),
(2, '345'),
(2, '345'),
(3, '123'),
(3, '123'),
(4, '456'),
(4, '456'),
(4, '456')]
我有一个想法是只取模拉所有重复的结果后:
N = db1.execute("SELECT Count(*) FROM foo").fetchone()[0]
data = [
list(data)
for data,n in itertools.groupby(sorted(data))
if np.mod(len(list(n)),N)==0
]
做哪些工作:
[[4, '456']]
但这似乎乱,我想喜欢在可能的情况下在第一个SQL查询中完成所有操作。
此外,在大型表(我真正的分贝有〜10K记录)这需要很长时间。任何方式来优化这个?谢谢!
2014-02-21
Joe Flip