【问题标题】:Multiple identical databases多个相同的数据库
【发布时间】:2014-05-07 15:59:03
【问题描述】:

首先让我先说我对 sql 有点陌生(但已经做了很长时间的 python)。我一直无法在网上找到一个好的解决方案来解决我的问题。

问题:

我有一个未定义的数量(尽管可能少于 100 个)相同结构的 sqlite 数据库,我需要从中查询和合并结果。数据库本身并不是特别庞大。

我一直在查看 ATTACH 命令并在本教程中遵循以下内容: http://souptonuts.sourceforge.net/readme_sqlite_tutorial.html

import sqlite3 as lite
Database = "library.db"
con = lite.connect(Database)
con.row_factory = lite.Row
cur = con.cursor()
cur.execute("ATTACH DATABASE 'library.db' As 'db1'")
cur.execute("ATTACH DATABASE 'library2.db' As 'db2'")

cur.execute("""
            SELECT 'db1',* FROM db1.table
            UNION 
            SELECT 'db2',* FROM db2.table
            """)

但似乎应该有比在执行命令中明确拼写每个数据库更好的方法。另外,我可以附加的数据库数量似乎有限制? https://sqlite.org/limits.html

我还研究了将它们合并到一个大型数据库中的方法: How can I merge many SQLite databases? 但是每次需要进行查询或许多单独的数据库之一发生更改时,将数据库合并在一起似乎效率低下。

在我继续前行之前,我想知道对于这种我不知道的事情是否有更好的选择?


有关该项目的其他可能有用的信息:

  • 有两个主要表。
  • 从 db 到 db 的表可以有重复。
  • 我需要能够在“合并”数据库的列中获取唯一值。
  • 了解数据来自哪个数据库并不重要。
  • 各个数据库会经常更新。
  • 经常查询“合并”数据库。

【问题讨论】:

  • 似乎您在这些数据库中有很多数据,并且您保持它们稀疏,因为您想避免多个进程争夺对文件的写访问权。也许是时候迁移到像 PostgreSQL 这样功能齐全的 DBMS 并拥有一个可以处理多个写入客户端的数据库了?
  • sqlite 的唯一原因是因为这是数据库的默认格式。它们可以轻松更改为 Postgre,但所有数据库都必须保留为单独的数据库(由个人维护在不同的位置)。我对此没有任何控制权,所以不幸的是,我真正能做的就是访问它们(复制、查询等)

标签: python database sqlite


【解决方案1】:

您可以通过使用视图来避免在每个查询中拼出所有数据库:

CREATE VIEW MyTable_all AS
SELECT 'db1', db1.* FROM db1.MyTable
UNION ALL
SELECT 'db2', db2.* FROM db1.MyTable
...

但是,如果数据库太多,则不能使用 ATTACH。 在这种情况下,您必须将所有数据库合并在一起。

如果每次对所有个数据库都这样做太慢,您可以通过保留每条记录的源来一次同步一个数据库:

DELETE FROM MyTable WHERE SourceDB = 1;
INSERT INTO MyTable SELECT 1, * FROM db1.MyTable;

【讨论】:

    猜你喜欢
    • 2013-11-11
    • 2015-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-10
    • 2014-11-12
    • 1970-01-01
    相关资源
    最近更新 更多