在python中将查询结果附加到Excel中的不同工作表

在python中将查询结果附加到Excel中的不同工作表,python,excel,pandas,Python,Excel,Pandas,我使用下面的代码在3个不同的数据库中运行3个不同的查询 并尝试将它们导出到单个Excel文件,每个结果都在不同的工作表上(总共9张工作表) 但是当运行下面的代码时,我得到一个只有3张表的文件(每个表只包含每个数据库上的第一个查询结果) 我正在使用pyodbc进行数据库连接和pandas,以便处理Excel编写 databases = {DB1, DB2, DB3} queries = {query1, query2, query3} writer = pd.ExcelWriter('C:\Te

我使用下面的代码在3个不同的数据库中运行3个不同的查询 并尝试将它们导出到单个Excel文件,每个结果都在不同的工作表上(总共9张工作表)

但是当运行下面的代码时,我得到一个只有3张表的文件(每个表只包含每个数据库上的第一个查询结果) 我正在使用
pyodbc
进行数据库连接和pandas,以便处理Excel编写

databases = {DB1, DB2, DB3}
queries = {query1, query2, query3}

writer = pd.ExcelWriter('C:\Temp\Output.xlsx')

for database in databases:
   cnxn = pyodbc.connect(driver='{SQL Server}', 
                         host=database.server, 
                         database=database.db_name,
                         trusted_connection=database.trusted_connection, 
                         user=database.user_name, 
                         password=database.password)
   cursor = cnxn.cursor()

   for q in queries:
      cursor.execute(q)
      rows = cursor.fetchall()
      df = pd.read_sql_query(q, cnxn)
      df.to_excel(writer, 
                  sheet_name=str(q.index(q))+"-"+database.name)
writer.save()

考虑内部循环中的
枚举
,以获取迭代器编号以及用于工作表命名的变量

...
for i, q in enumerate(queries):
  df = pd.read_sql_query(q, cnxn)
  df.to_excel(writer, 
              sheet_name=str(i+1)+"-"+database.name)
...
或者,如果查询是一个列表,则可以使用
索引
方法:

queries = [query1, query2, query3]

...
for q in queries:
  df = pd.read_sql_query(q, cnxn)
  df.to_excel(writer, 
              sheet_name=str(queries.index(q)+1)+"-"+database.name)
...

考虑内部循环中的
枚举
,以获取迭代器编号以及用于工作表命名的变量

...
for i, q in enumerate(queries):
  df = pd.read_sql_query(q, cnxn)
  df.to_excel(writer, 
              sheet_name=str(i+1)+"-"+database.name)
...
或者,如果查询是一个列表,则可以使用
索引
方法:

queries = [query1, query2, query3]

...
for q in queries:
  df = pd.read_sql_query(q, cnxn)
  df.to_excel(writer, 
              sheet_name=str(queries.index(q)+1)+"-"+database.name)
...

XML从何而来?无论如何-与其在执行每个查询后进行写入,为什么不建立一个包含所有查询的单一数据帧,然后进行写入?另外-如果您使用的是
cursor.execute
,然后是
rows=cursor.fetchall()
-那么为什么要使用
pd.read\u sql\u query
(再次执行查询)而不是将前面的内容直接输入到数据帧中?
str(q.index(q))
这总是给0,所以你得到的是0吗_DBNAME@JonClements对不起,我写的是XML而不是Excel。@JonClements我试着对2进行注释,希望pd.read\u sql\u query(q,cnxn)能提供我所需要的,但它一直得到空输出,直到返回它们。XML从何而来?无论如何-与其在执行每个查询后进行写入,为什么不建立一个包含所有查询的单一数据帧,然后进行写入?另外-如果您使用的是
cursor.execute
,然后是
rows=cursor.fetchall()
-那么为什么要使用
pd.read\u sql\u query
(再次执行查询)而不是将前面的内容直接输入到数据帧中?
str(q.index(q))
这总是给0,所以你得到的是0吗_DBNAME@JonClements对不起,我写的是XML而不是Excel。@JonClements我试着对2进行注释,希望pd.read\u sql\u query(q,cnxn)能提供我所需要的,但它一直得到空输出,直到返回它们为止。它起作用了,但我仍然不确定为什么索引(q)在迭代查询时不提供相同的内容。我相信您打算创建一个列表,但使用了集合的值。如果查询是一个列表,您可以使用
querys.index(q)
。它是有效的,但我仍然不确定为什么index(q)在迭代查询时不提供相同的内容。我相信您打算创建一个列表,但使用了集合的值。如果查询是一个列表,您可以使用
querys.index(q)