如何处理 cx_Oracle 连接内 for 循环内的错误?

How can I handle errors inside of a for loop inside of a cx_Oracle connection?

这是我想做的事情的 运行:我有一个 table 名字的列表,我想 运行 sql 反对一个oracle 数据库并为我的 table 列表中的每个 table 拉回 table 名称和行数。但是,并非我的 table 名称列表中的每个 table 名称都一定实际存在于数据库中。这导致我的代码抛出数据库错误。我想做的是,每当我遇到不在数据库中的 table 名称时,我都会创建一个包含 table 名称的数据框,而不是计数(*),有一些文本上面写着 'table not found' 或类似的东西。在循环结束时,我将所有数据帧连接成一个数据帧。这里的总体目标是验证某些 table 是否存在并且它们具有预期的行数。

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)

获取数据库中所有 Table 个名称的列表,然后创建一个循环来查询每个 Table 以获取行数。

这是一个 SQL 语句,用于获取 Oracle 数据库中所有 Table 的列表:

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

考虑 try/except 处理 return 查询输出或 table 未找到输出:

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)