Сравнить две таблицы в разных базах данных Oracle с помощью python cx_Oracle

#python #oracle #python-2.7 #cx-oracle

#python #Oracle #python-2.7 #cx-oracle

Вопрос:

Моя цель — сравнить несколько таблиц в нескольких базах данных с одной таблицей в другой базе данных (назовем ее базовой таблицей).

Каждая таблица имеет идентификатор и версию. Я хочу проверить, все ли записи базовой таблицы обновлены и синхронизированы во всех других таблицах (просто проверив, присутствуют ли ID и VERSION в других таблицах, игнорируя другие столбцы). Я хочу сравнить их как можно более эффективно (не запрашивая все данные и не храня их в памяти), потому что существует более 150 тыс. записей данных.

Это должно произойти в scipt python, и я использую cx_Oracle.

Моя первая попытка состояла в том, чтобы запросить идентификатор и версии из базовой таблицы, используя курсор, извлекающий одну строку за другой. но тогда мне пришлось бы создать более 150 тысяч выборок в других таблицах, которые были бы неполноценными. Кто-нибудь знает, как эффективно сравнивать их?

Код выглядит следующим образом:

 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()
 

Комментарии:

1. Можете ли вы использовать ссылки на БД, чтобы данные не приходилось передавать в Python больше, чем необходимо? Можно ли каким-либо образом вычислить и сравнить хэш значений данных? Не забудьте настроить arraysize , см. cx-oracle.readthedocs.io/en/latest/user_guide/tuning.html

2. Нет, ссылки на БД не должны использоваться. Спасибо 🙂

Ответ №1:

Вы можете запросить идентификатор / версию из своих таблиц и сохранить их в словаре, затем выполнить итерацию по другой таблице и посмотреть, присутствует ли идентификатор / версия из этой таблицы в первой. Да, для этого потребуется 150 тысяч записей в вашем словаре. Если это неприемлемо или если число будет иметь тенденцию к дальнейшему росту с течением времени, рассмотрите какой-либо способ группировки идентификатора / версии в пакеты. Если идентификатор представляет собой простую последовательность, начинающуюся с 1, вы можете затем выполнять запросы, которые извлекают первые 10 тыс. идентификаторов, следующие 10 тыс. идентификаторов и так далее.

Комментарии:

1. Как бы вы нашли идентификаторы и версии, которые есть в вашем словаре, а не в одной из других таблиц? Ваша проверка будет проверять только полноту словаря, но я скорее хочу проверить полноту других таблиц, не сохраняя их все в словарях

2. Я предположил, что вы просто сравниваете каждого из детей с мастером. Если вам нужно выполнить многоходовое сравнение, то у вас должны быть все ключи в памяти. В этом случае имеет смысл разделить ключи на группы, чтобы ограничить использование памяти.