如何遍历Pervasive服务器多数据库并为结果添加数据库名列?
问题解决:为多数据库查询结果添加对应数据库名列
你的代码问题出在嵌套循环遍历所有数据库名,导致df['DATABASE']被反复赋值,最终所有DataFrame的该列都被覆盖成最后一个数据库名(db2)。
修正后的代码
import pyodbc import pandas as pd databases = ['db1','db2'] sql = 'select top 10 * from testdatabase' connect_string = 'DRIVER=Pervasive ODBC Interface;SERVERNAME=1.1.1.1:1111;DBQ={}' data = [] try: # 同时遍历数据库名和对应的连接,确保一一对应 for db_name in databases: conn = pyodbc.connect(connect_string.format(db_name)) cur = conn.cursor() rows = cur.execute(sql).fetchall() # 生成DataFrame并添加对应数据库名列 df = pd.DataFrame.from_records(rows, columns=[col[0] for col in cur.description]) df['DATABASE'] = db_name data.append(df) # 及时关闭当前连接和游标 cur.close() conn.close() except Exception as e: print(e) # 合并所有结果 final_df = pd.concat(data, axis=0).reset_index(drop=True) print(final_df)
关键修改说明
- 去掉了单独创建connections和cursors列表的步骤,改为直接遍历
databases列表,每次处理单个数据库的连接、查询和结果,逻辑更清晰。 - 不再嵌套循环所有数据库名,而是直接用当前遍历的
db_name赋值给df['DATABASE'],确保每个数据库的查询结果对应正确的名称。 - 每次处理完一个数据库后立即关闭连接和游标,避免资源占用。
优化方向(可选)
如果数据库数量较多,可以用上下文管理器with自动管理连接,无需手动关闭:
for db_name in databases: with pyodbc.connect(connect_string.format(db_name)) as conn: with conn.cursor() as cur: rows = cur.execute(sql).fetchall() df = pd.DataFrame.from_records(rows, columns=[col[0] for col in cur.description]) df['DATABASE'] = db_name data.append(df)
内容的提问来源于stack exchange,提问作者aero8991
相关产品推荐
相关产品推荐

