使用Pandas与SQLAlchemy读取MS Access查询返回空DataFrame求助
解决Access查询返回空DataFrame的问题
以下是针对你遇到问题的排查和解决步骤:
1. 先确认数据是否存在匹配结果
直接在MS Access软件中运行你的查询语句,查看是否能得到返回结果:
- 如果Access里也返回空,说明是查询条件筛选后没有匹配的数据,需要调整条件逻辑;
- 如果Access里有结果,问题则出在Python连接时的SQL语法兼容上。
2. 修正LIKE通配符(核心问题)
你的连接字符串中设置了ExtendedAnsiSQL=1,这会让Access ODBC驱动启用ANSI SQL标准的通配符规则:
- 用
%代替Access默认的*作为多字符通配符 - 用
_代替Access默认的?作为单字符通配符
而你的查询里仍在使用*,还添加了不必要的转义\*,这会导致条件匹配失败,最终返回空DataFrame。修改后的查询语句如下:
RAFAELquery= ''' SELECT SAP_CONSO.Cofor6, SAP_CONSO.TypePce, SAP_CONSO.Ste, Count(SAP_CONSO.Nfact) AS CompteDeNfact FROM SAP_CONSO GROUP BY SAP_CONSO.Cofor6, SAP_CONSO.TypePce, SAP_CONSO.Ste, SAP_CONSO.SaiParFlux HAVING (SAP_CONSO.TypePce Not Like 'y%') AND (SAP_CONSO.SaiParFlux Like '%E') ORDER BY SAP_CONSO.TypePce DESC; '''
3. 验证基础连接与数据读取
如果修改后仍然返回空,可以先执行一个简单查询验证连接和数据读取是否正常:
df_test = pd.read_sql_query("SELECT TOP 10 * FROM SAP_CONSO", engine) print(df_test)
- 若该查询能返回数据,说明连接正常,继续调整分组查询的条件逻辑;
- 若仍为空,需检查表名拼写(注意大小写、特殊字符)、数据库文件路径是否正确。
4. 检查GROUP BY子句的合理性
你的GROUP BY包含了SAP_CONSO.SaiParFlux,但SELECT中并未包含该字段。虽然语法上允许,但如果该字段的不同取值导致分组后没有符合HAVING条件的组合,也会返回空结果。可以尝试:
- 若业务逻辑允许,去掉GROUP BY中的
SAP_CONSO.SaiParFlux; - 单独查询
SAP_CONSO.SaiParFlux字段,确认存在符合Like '%E'的值。
内容的提问来源于stack exchange,提问作者Stéphanie Ricardo
相关产品推荐
相关产品推荐

