получение списка таблиц с количеством строк из cratedb

#python #cratedb

Вопрос:

Мне было поручено проверить восстановление баз данных crate из одного региона AWS в другой. Резервное копирование и восстановление уже выполняются, но у нас нет возможности проверить, успешно ли выполняется восстановление, не копаясь в каждом задании восстановления по отдельности. Метод, который мы выбрали для проверки восстановления, состоит в том, чтобы получить csv-файл, содержащий список каждой таблицы в базе данных и связанное с ней количество строк перед резервным копированием в первом регионе, скопировать его в S3, а затем создать аналогичный файл после восстановления во втором регионе, а затем сравнить два файла. Однако crate не определяет «имя таблицы» в INFORMATION_SCHEMA.tables, поэтому этот запрос:

SELECT CONCAT(table_schema, '.', table_name) FROM INFORMATION_SCHEMA.TABLES where table_schema IN ('doc', 'app');

не сработает. Я понял, как это сделать в bash следующим образом:

 /apps/crate/crash -c "SELECT CONCAT(table_schema, '.', table_name) FROM INFORMATION_SCHEMA.TABLES where table_schema IN ('doc', 'app');" --format csv | grep -v ^' | dos2unix gt; crate_tables  for x in $(cat crate_tables) ; do /apps/crate/crash -c "select count(1) from ${x};" --format csv | egrep -v "^$|^count"; done | dos2unix gt; crate_row_count  paste -d ',' crate_tables crate_row_count gt; crate_table_row_count.csv  

но мне сказали сделать это на python. У меня есть начало сценария, но я не знаю, как использовать выходные данные первого запроса в качестве входных данных для второго запроса:

 #!/usr/bin/env python3 from crate import client connection = client.connect('10.30.76.251:4200') cursor = connection.cursor() cursor.execute("""  SELECT CONCAT(table_schema, '.', table_name) FROM INFORMATION_SCHEMA.TABLES where table_schema IN ('doc', 'shn')""") TableList = cursor.fetchall() for TableName in TableList:  print(TableName)  cursor.execute("""  SELECT COUNT(*) from (SELECT CONCAT(table_schema, '.', table_name) FROM INFORMATION_SCHEMA.TABLES where table_schema IN ('doc', 'shn'))""")  RowCount = cursor.fetchone()  print(RowCount)  # print(Table_List) cursor.close() connection.close()  

Любая помощь будет весьма признательна.

Ответ №1:

Возможно, альтернативный (более простой) подход заключается в использовании sys.shards таблицы

 SELECT   schema_name || '.' || table_name as fqn,  sum(num_docs) as total_records FROM sys."shards" WHERE schema_name IN ('doc', 'shn') AND "primary" GROUP BY fqn;  
 #!/usr/bin/env python3 from crate import client import csv  connection = client.connect('10.30.76.251:4200') cursor = connection.cursor()  cursor.execute("""  SELECT   schema_name || '.' || table_name as fqn,  sum(num_docs) as total_records  FROM sys."shards"  WHERE schema_name IN ('doc', 'shn') AND "primary"  GROUP BY fqn;""")  TableList = cursor.fetchall()  with open('path/to/csv_file', 'w', encoding='UTF8') as f:  writer = csv.writer(f)  for TableName in TableList:  writer.writerow(TableName)   

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

1. Если вы просто хотите сравнить количество строк для первичных сегментов (исключая количество строк реплик), добавьте в запрос предложение where primary = true