You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何遍历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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 23:57:19