【问题标题】:Compare two tables in different oracle databases with python cx_Oracle用python cx_Oracle比较不同oracle数据库中的两张表
【发布时间】:2021-03-15 07:57:08
【问题描述】:

我的目标是将多个数据库中的多个表与另一个数据库中的一个表进行比较(我们称之为基表)。

每个表都有一个 ID 和一个版本。我想检查基表的条目是否都是最新的并在所有其他表中同步(只需检查其他表中是否存在 ID 和 VERSION,忽略其他列)。我想尽可能高效地比较它们(不是查询所有数据并将其保存在内存中),因为有超过 150k 的数据条目。

这发生在 python scipt 中,我正在使用 cx_Oracle。

我的第一次尝试是从基表中查询 ID 和版本,使用游标逐行获取。但随后我将不得不在其他表中创建 150k+ 选择,这将是无能的。有谁知道两者如何有效地比较它们?

代码如下:

schemas = ["x","y","z"]

baseConn = cx_Oracle.connect(CONN TO DATABASE1)
baseCursor = conn.cursor()
baseCursor.execute("SELECT ID, Version FROM XXX")

res = cursor.fetchall()[0][0]


icc_count = int(res)

for schema in schemas:
    conn = cx_Oracle.connect(CONN TO DATABASE2)
    cursor = conn.cursor()
    cursor.execute("SELECT ID, VERSION FROM " + schema)

    # compare data of baseCursor and cursor here...
    
    cursor.close()
    conn.close()


baseCursor.close()
baseConn.close()

【问题讨论】:

  • 你可以使用 DB Links,这样就不必将数据传输到 Python 所需的范围之外吗?有什么方法可以计算和比较数据值的哈希值吗?别忘了调arraysize,见cx-oracle.readthedocs.io/en/latest/user_guide/tuning.html
  • 不,不应使用数据库链接。谢谢:)

标签: python oracle python-2.7 cx-oracle


【解决方案1】:

您可以从表中查询 id/version 并将它们存储在字典中,然后遍历另一个表并查看该表中的 id/version 是否存在于第一个表中。是的,这需要您的字典中有 150k 个条目。如果这是不可接受的,或者如果随着时间的推移数字会进一步增长,那么考虑某种方式将 id/version 分组为批次。如果 id 是一个从 1 开始的简单序列,那么您可以执行检索前 10k 个 id、接下来的 10k 个 id 等等的查询。

【讨论】:

  • 您如何找到字典中而不是其他表之一的 ID 和版本?您的检查只会检查字典的完整性,但我想检查其他表的完整性而不将它们全部存储在字典中
  • 我以为您只是将每个孩子与主人进行比较。如果您必须进行多路比较,那么您必须将所有键都保存在内存中。在这种情况下,将键分成组以限制内存使用是有意义的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-08-12
  • 2017-04-26
  • 2021-04-23
  • 1970-01-01
  • 2023-03-06
  • 1970-01-01
  • 2021-12-16
相关资源
最近更新 更多