首页 > 解决方案 > 使用 cursor.fetchall() 返回空数据框

问题描述

我有一个可能返回或非记录的 SQL 查询。我需要在 Python 中执行这个查询:

import os
import pandas as pd
import pymysql
from pandas import ExcelWriter
from sqlalchemy import create_engine

connection = pymysql.connect(host='localhost',
                            user='root',
                            password='root',
                            db='device_db',
                            cursorclass=pymysql.cursors.DictCursor)

cur3=connection.cursor()

cur3.execute('SELECT outgoing_db.Customer_No, sum(SUM_IC_CALLS) AS SumOfSUM_IC_CALLS, sum(SUM_AIC_DURATION_C1) AS SumOfSUM_AIC_DURATION_C1, sum(SUM_AIC_AMOUNT_C1) AS SumOfSUM_AIC_AMOUNT_C1, outgoing_db.Rate, outgoing_db.Customer_Name FROM outgoing_db WHERE (((outgoing_db.User_ID) != ("IND")) AND ((outgoing_db.Incoming_ID)="Airtel") AND ((outgoing_db.Customer_Type)="Check") AND ((outgoing_db.Current_Operation)="NO") AND ((outgoing_db.Active)="NO")) GROUP BY outgoing_db.Customer_No, outgoing_db.Rate, outgoing_db.Customer_Name HAVING (((outgoing_db.Customer_No) In (33165,33197)));')
mydf3=pd.DataFrame(cur3.fetchall())
print(mydf3)

它给了我一个例外:

Traceback (most recent call last):
  File "C:\wamp64\www\DevicePortal\Query.py", line 16, in <module>
    mydf3=pd.DataFrame(cur3.fetchall())
  File "C:\Users\Sonal\AppData\Local\Programs\Python\Python36\lib\site-packages\pandas\core\frame.py", line 404, in __init__
raise ValueError('DataFrame constructor not properly called!')
ValueError: DataFrame constructor not properly called! 

当我在做cur3.fetchone()它给了我一个输出:

Empty DataFrame
Columns: []
Index: []

但未来可能会添加数据(大约 100 万)。是否有使用cur3.fetchall()返回空数据帧的解决方案

标签: python

解决方案


fetchall()返回一个元组列表;如果你想从它们构建一个数据框,你可以使用pandas.DataFrame.from_records()

一种更简单的方法是直接从 SQL 读取数据:

pandas.read_sql()

它有一个chunksize参数,如果您的数据集太大,您可以分块加载数据。

在这里阅读:

https://pandas.pydata.org/pandas-docs/version/0.17.0/generated/pandas.DataFrame.from_records.html https://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_sql .html


推荐阅读