DB2查询在Python 3.x中返回0条记录的排查方向咨询
首先得明确一个关键误区:你用的pandasql并不是直接连接DB2数据库的工具!它的作用是对已经加载到Python内存中的pandas DataFrame执行类SQL查询(底层基于SQLite引擎)。你的代码里完全没有连接DB2、读取数据到df_J_CUST的逻辑,这大概率是导致返回0条结果的核心原因。下面是具体的排查步骤:
确认
df_J_CUST是否已正确加载DB2数据
先在代码里添加一行print(df_J_CUST.shape)或者print(df_J_CUST.head()),检查这个DataFrame是否为空,或者里面的数据是否和你在Squirrel中查询的DB2表一致。如果df_J_CUST是空的,那么pandasql返回0条结果就完全合理。检查查询字符串中的隐藏特殊字符
观察你贴出的str变量内容,部分单引号后似乎存在看不见的Unicode空白字符(比如'K001877'里的7前有零宽空格)。这种隐藏字符会导致条件匹配失败,即使语法看起来正确。你可以把字符串复制到能显示所有字符的文本编辑器(比如Notepad++开启显示所有字符功能)里检查,或者重新手动输入一遍查询条件的字符串。注意SQL语法的兼容性差异
DB2和SQLite(pandasql底层引擎)的SQL语法存在细微差异,虽然你的查询语句比较基础,但还是要注意:- 字符串常量的处理:两者都支持单引号,但要确保没有转义错误
- 函数或关键字的差异:比如某些DB2特有的函数在SQLite中不支持,但你的查询里没有这类情况,主要还是先排查字符问题
替换为真正的DB2连接工具(如果目标是直接查询DB2)
如果你本来就想直接从DB2数据库查询数据,应该使用专门的DB2 Python驱动,比如ibm_db或ibm_db_sa配合SQLAlchemy,而不是pandasql。举个简单的示例:import ibm_db import pandas as pd # 配置DB2连接参数 conn_str = "DATABASE=你的数据库名;HOSTNAME=你的主机地址;PORT=端口号;PROTOCOL=TCPIP;UID=用户名;PWD=密码;" conn = ibm_db.connect(conn_str, "", "") # 执行查询 query = """select distinct Cno from df_J_CUST where ID in ('95427','95405','95429') and GRP not in ('K915B','K9F0S','K9M4U','K9QBJ','K0012AS','K0015R5','K001877','K001H1N','K95U5','K9GEX','K9M6L','K9YGP','K00159S','K00184E','K226QMF') and CODE in ('1PY2','5AR1','9U1Y') and TYPE = 'L'""" stmt = ibm_db.exec_immediate(conn, query) # 将结果转换为pandas DataFrame df1 = pd.DataFrame(ibm_db.fetch_assoc(stmt)) # 关闭连接 ibm_db.close(conn)验证查询语句在SQLite环境中的有效性
你已经用print(str2)输出了拼接后的查询语句,可以把这个语句复制到SQLite的可视化工具(比如DB Browser for SQLite)中,在包含df_J_CUST数据的SQLite数据库中执行,看是否能得到预期结果,以此排查是语句问题还是数据问题。
内容的提问来源于stack exchange,提问作者JDoe

