如何用Python获取CrateDB表行数实现跨AWS区域恢复验证
问题原因
- 你第一次查询用
fetchall()拿到的TableList是单元素元组组成的列表,格式为[('doc.table1',), ('app.table2',)],循环时需要先取出元组内的表名字符串才能使用 - 原脚本里第二次查询的SQL逻辑错误,不需要再查信息表,应该直接对循环到的表名执行
COUNT(*)查询,把表名动态拼入SQL即可
修正后的完整代码
#!/usr/bin/env python3 import csv from crate import client # 可配置项,根据实际场景修改即可 CRATE_HOST = '10.30.76.251:4200' SCHEMA_LIST = ('doc', 'shn') OUTPUT_CSV = 'crate_table_row_count.csv' def main(): connection = client.connect(CRATE_HOST) cursor = connection.cursor() result = [] try: # 第一步:查询所有符合条件的表的全限定名 cursor.execute(""" SELECT CONCAT(table_schema, '.', table_name) FROM INFORMATION_SCHEMA.TABLES WHERE table_schema IN (%s) """ % ','.join(f"'{s}'" for s in SCHEMA_LIST)) table_list = cursor.fetchall() # 第二步:循环统计每个表的行数 for table_tuple in table_list: table_name = table_tuple[0] cursor.execute(f"SELECT COUNT(1) FROM {table_name}") row_count = cursor.fetchone()[0] result.append((table_name, row_count)) print(f"{table_name}: {row_count}") # 第三步:输出CSV文件,和原有bash版本格式完全一致 with open(OUTPUT_CSV, 'w', newline='', encoding='utf-8') as f: writer = csv.writer(f) writer.writerows(result) print(f"统计结果已写入{OUTPUT_CSV}") finally: cursor.close() connection.close() if __name__ == '__main__': main()
适配说明
输出的CSV文件和你原有bash版本生成的格式完全匹配,可直接用于跨区域恢复后的差异校验,不需要额外调整对比逻辑。
内容的提问来源于stack exchange,提问作者ajhowey
相关产品推荐
相关产品推荐

