AttributeError: 'int' object has no attribute 'to_dict'

AttributeError: 'int' object has no attribute 'to_dict'

我的代码有这个问题。我有一个字符串列表 symbols,我将其作为参数传递到我的函数 statsTable() .

我在我的 SQL 查询中使用 symbols 列表从我的 DB 中提取请求的项目,在我的例子中,这个列表是一个股票列表。我不想在这里使用循环。该函数的输出应该使用我的 PostgreSQL dB.

中的数据创建一个 DataFrame

往下看:

@app.callback(
dash.dependencies.Output('table_stats', 'data'),
[dash.dependencies.Input('dynamic-dropdown', 'value')])

def statsTable(symbols):
    if symbols == None:
        raise PreventUpdate

    symbols = tuple(symbols)

    df = postgresql_to_dataframe(conn, f"SELECT id, companyname, marketcap, to_char(100.0*week52change,'999D99%'), week52high, week52low, to_char(dividend_yield * 100, '99D99%'), next_earnings_date, pe_ratio, ROUND(beta,2) FROM security_stats WHERE security_stats.id IS {symbols} ;", col)
    data = df.to_dict('rows')
    columns=[{"name": i, "id": i} for i in security_stats.columns]
    return dt.DataTable(data=data, columns=columns)

我将股票列表转换为元组以删除括号,这样我的 SQL 查询就不会混淆。当我 运行 我的 Dash 应用程序的代码时,我得到 AttributeError: 'int' object has no attribute 'to_dict'.

我不明白为什么,因为当我在沙盒环境中 运行 下面的代码(以测试它是否有效)时,一切似乎都很好,我得到了我要求的数据的 DataFrame ,不使用循环:

symbols = ('FB','AAPL', 'EBAY','AMD')
col = ['Symbol','Company','Market Cap','1yr-Change', '52-Week High','52-Week Low','Dividend Yield','Next Earnings Report','PE-Ratio','Beta']

df = postgresql_to_dataframe(conn, f"SELECT id, companyname, marketcap, to_char(100.0*week52change,'999D99%'), week52high, week52low, to_char(dividend_yield * 100, '99D99%'), next_earnings_date, pe_ratio, ROUND(beta,2) FROM security_stats WHERE security_stats.id IN {symbols} ;", col)
df.head()

这是我正在寻找的输出...

如果这有帮助,这是我用来提取 SQL 数据并将其转换为 DataFrame 的函数:

def postgresql_to_dataframe(conn, select_query, column_names):
    """
    Tranform a SELECT query into a pandas dataframe
    """
    cursor = conn.cursor()
    try:
        cursor.execute(select_query)
    except (Exception, psycopg2.DatabaseError) as error:
        print("Error: %s" % error)
        cursor.close()
        return 1
    
    # Naturally we get a list of tupples
    tupples = cursor.fetchall()
    cursor.close()
    
    # We just need to turn it into a pandas dataframe
    df = pd.DataFrame(tupples, columns=column_names)
    return df

是什么导致我在 statsTable(symbols) 函数中引发此错误 AttributeError: 'int' object has no attribute 'to_dict'?我很感激我能得到的所有帮助,一直在努力解决这个问题。

编辑: 这是完整的错误。

>>> data = df.to_dict('rows')
AttributeError: 'int' object has no attribute 'to_dict'
try:
    cursor.execute(select_query)
except (Exception, psycopg2.DatabaseError) as error:
    print("Error: %s" % error)
    cursor.close()
    return 1

当引发异常时,您的异常处理会导致 postgresql_to_dataframe 到 return 一个整数而不是一个 DataFrame。当然,不可能对整数调用 .to_dict,因为错误消息非常明确地告诉您。

所以近因是查询执行引发了异常。 Dash 应用程序可能是一个不允许您查看标准输出的上下文,因此您不会收到错误打印输出。