这里有一个跑步的想什么,我做下来:我有表名的列表,我想对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)
考虑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)
获取这些都在数据库中的所有表名的列表,然后创建一个循环来查询每个表来获得行计数。
下面是一个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)))