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

问题描述 投票:0回答:2

这里有一个跑步的想什么,我做下来:我有表名的列表,我想对Oracle数据库运行SQL并拉回表名和行数在我的表列表中的每个表。然而,不是我的表名的列表中的每个表的名称是必然实际上在数据库中。这使我的代码抛出一个数据库错误。我想这样做的,就是每当我来,是不是在数据库中的表名,我创建一个包含表名和代替COUNT(*)一个数据帧,有一些文字,上面写着“未找到表”,或类似的东西。在循环结束时,我连接所有的dataframes到一个数据帧。这里的总体目标是,以验证某些表存在,并且他们有预期的行数。

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)
python pandas cx-oracle
2个回答
0
投票

考虑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
投票

获取这些都在数据库中的所有表名的列表,然后创建一个循环来查询每个表来获得行计数。

下面是一个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)))
© www.soinside.com 2019 - 2024. All rights reserved.