Как я могу обработать ошибки внутри цикла for внутри соединения cx_Oracle? - PullRequest
0 голосов
/ 04 февраля 2019

Вот краткий перечень того, что я хотел бы сделать: у меня есть список имен таблиц, и я хочу запустить sql для базы данных oracle и получить обратно имя таблицы и количество строк для каждой таблицы в моем списке таблиц,Однако не каждое имя таблицы в моем списке имен таблиц обязательно находится в базе данных.Это заставляет мой код выдавать ошибку базы данных.Что я хотел бы сделать, так это когда бы я ни приходил к имени таблицы, которого нет в базе данных, я создаю фрейм данных, который содержит имя таблицы, и вместо count (*), есть некоторый текст, который говорит «таблица не найдена»,или что-то подобное.В конце цикла я объединяю все кадры данных в один.Общая цель здесь - проверить, существуют ли определенные таблицы и имеют ли они ожидаемое количество строк.

query_list=[]

df_List=[]

connstr= '%s/%s@%s' %(username, password, server)
conn = cx_Oracle.connect(connstr)   

with conn:

        query_list = ["SELECT '%s' as tbl, count(*) FROM %s." %(elm, database) +elm for elm in table_list]

        df_List = [pd.read_sql(elm,conn) for elm in query_list]

df = pd.concat(df_List)

Ответы [ 2 ]

0 голосов
/ 05 февраля 2019

Рассмотрим обработку try/except для возврата вывода запроса или вывода таблицы не найдено:

def get_table_count(sql, conn, elm):
    try:
        return pd.read_sql(sql, conn)
    except:
        return pd.DataFrame({'tbl': elm, 'note': 'table not found'}, index = [0])

with conn:
   sql = "SELECT '{t}' as tbl, count(*) as table_count FROM {d}.{t}"

   df_List = [get_table_count(sql.format(t = elm, d = database), conn, elm)  \
                   for elm in table_list]

df = pd.concat(df_List, ignore_index = True)
0 голосов
/ 04 февраля 2019

Получите список всех имен таблиц, которые есть в БД, затем создайте цикл для запроса каждой таблицы, чтобы получить количество строк.

Вот инструкция SQL, чтобы получить список всех таблиц вБД Oracle:

SQL:

SELECT DISTINCT TABLE_NAME FROM ALL_TAB_COLUMNS ORDER BY TABLE_NAME ASC;

Python (для составления списка таблиц, для которых требуется количество строк и которые существуют в БД):

 list(set(tables_that_exist_in_DB) - (set(tables_that_exist_in_DB) - set(list_of_tables_you_want)))
...