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

Python执行DB2 SQL脚本导出CSV行数不符问题求助

解决方案:Python连接DB2查询结果行数少于DBeaver的问题

针对你遇到的Python脚本查询DB2仅返回10800行、但DBeaver能返回34000行的问题,可尝试以下几种解决方法:

1. 调整游标结果集获取参数

ibm_db游标默认的结果集限制可能导致部分数据未被读取,可通过设置游标属性扩大单次获取的行上限:

from ibm_db import connect, SQL_ATTR_ROWSET_SIZE
import ibm_db_dbi
import csv

DBdetails = connect('DATABASE=;'
                    'HOSTNAME=;'
                    'PORT=;'
                    'PROTOCOL=;'
                    'UID=;'
                    'PWD=;', '', '')
conn = ibm_db_dbi.Connection(DBdetails)

with open("DB2SQLquery.sql", "r") as script_file:
    sql_script = script_file.read()
    cursor = conn.cursor()
    # 设置游标行集大小,扩大单次获取量
    ibm_db.set_option(cursor, {SQL_ATTR_ROWSET_SIZE: 10000}, 0)
    cursor.execute(sql_script)

with open("output.csv", "w", newline="") as file:
    writer = csv.writer(file)
    writer.writerow([i[0] for i in cursor.description])
    # 直接获取全部结果,避免分批遗漏
    rows = cursor.fetchall()
    writer.writerows(rows)

cursor.close()
conn.close()

2. 使用Pandas直接读取导出

Pandas的read_sql方法会自动处理完整结果集的读取,避免手动分批获取可能出现的遗漏:

from ibm_db import connect
import ibm_db_dbi
import pandas as pd

DBdetails = connect('DATABASE=;'
                    'HOSTNAME=;'
                    'PORT=;'
                    'PROTOCOL=;'
                    'UID=;'
                    'PWD=;', '', '')
conn = ibm_db_dbi.Connection(DBdetails)

with open("DB2SQLquery.sql", "r") as script_file:
    sql_script = script_file.read()

# 一次性读取完整结果集
df = pd.read_sql(sql_script, conn)
# 导出CSV,排除索引列
df.to_csv("output.csv", index=False)

conn.close()

3. 统一事务隔离级别

DBeaver与Python脚本可能使用了不同的事务隔离级别,导致查询数据范围不一致。可调整Python连接的隔离级别匹配DBeaver默认设置:

from ibm_db import connect
import ibm_db_dbi
import pandas as pd

DBdetails = connect('DATABASE=;'
                    'HOSTNAME=;'
                    'PORT=;'
                    'PROTOCOL=;'
                    'UID=;'
                    'PWD=;', '', '')
conn = ibm_db_dbi.Connection(DBdetails)

# 设置读未提交隔离级别,与多数SQL客户端默认一致
conn.set_isolation_level(ibm_db_dbi.SQL_TXN_READ_UNCOMMITTED)

with open("DB2SQLquery.sql", "r") as script_file:
    sql_script = script_file.read()

df = pd.read_sql(sql_script, conn)
df.to_csv("output.csv", index=False)

conn.close()

4. 验证SQL脚本完整性

确保读取的SQL脚本无隐藏内容(如多余分号、注释或无关语句),可直接将SQL硬编码到脚本中测试:

# 替换文件读取部分,直接使用目标SQL
sql_script = """SELECT USERTYPE,TYPENAME FROM mytable t WHERE VALID = 'V'"""
cursor.execute(sql_script)

内容的提问来源于stack exchange,提问作者Eoin Power

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 01:04:58