如何处理 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)
这是我想做的事情的 运行:我有一个 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)