如何一次在sqlalchemy中查询多个表名?

时间:2019-05-13 13:50:39

标签: python-3.x pandas loops sqlalchemy

我在csv的一列中有一个表列表,这些数据已作为数据帧读入到熊猫中,如下所示:

df = pd.read_csv('~/tablenames')

表名csv看起来像这样:

tablenames
 table1
 table2

创建与数据库的连接并遍历数据框的方式如下:

import pandas as pd
from sqlalchemy import create_engine

df = pd.read_csv('~/tablenames')

engine = create_engine('connection_string')


 for index,row in df.iterrows():
        df['column_count'] = pd.read_sql_query("select count(column_name) from information_schema.columns where table_name = '%s'"%row['table_name'],con=engine)
        df['row_count'] = pd.read_sql_query("select count(*) from %s"%row['table_name'],con=engine)

以上循环仅获取第一个表数据,并且仅对数据帧中的第一个表执行查询。对于数据帧中其余表名没有执行查询的地方,我在做什么?

我没有收到任何错误消息。如果有帮助,我正在连接到postgres数据库。

编辑:

 count
0     45
   count
0     89
   count
0     36
   count
0     17
   count
0     12

2 个答案:

答案 0 :(得分:0)

将for循环更改为

 #also here add .iloc[0]
 for index,row in df.iterrows():
        df.loc[index,'column_count'] = pd.read_sql_query("select count(column_name) from information_schema.columns where table_name = '%s'"%row['table_name'],con=engine).iloc[0]
        df.loc[index,'row_count'] = pd.read_sql_query("select count(*) from %s"%row['table_name'],con=engine).iloc[0]

更新

for index,row in df.iterrows():
     updatedf=pd.read_sql_query("select * from information_schema.columns where table_name = '%s'"%row['table_name'],con=engine)   
     df.loc[index,'column_count'] = updatedf.shape[1]
     df.loc[index,'row_count'] = updatedf.shape[0]

答案 1 :(得分:-1)

尝试熊猫concat

import glob
import pandas as pd

# glob.glob('table*.csv') - returns List[str]
# for f in glob.glob() - returns a List[DataFrames]

df = pd.concat([pd.read_csv(f) for f in glob.glob('table*.csv')], ignore_index = True)