使用ORM的FastAPI无法转换为pandas。

7 浏览
0 Comments

使用ORM的FastAPI无法转换为pandas。

我一直在开发一种使用FastAPI查询数据库的方式,而不是直接使用pg的SQL。

出于某种原因,我在将ORM查询返回的值转换为可用于pandas数据框的内容时遇到了问题。

例如,

def sentimentDataframe(db: Session, user_id: str):
    Sentiment = pd.read_sql((get_sentiment(db,user_id)),con=db)
    Sentiment['created'] =pd.to_datetime(Sentiment['created'], unit='s')
    return Sentiment.set_index('created')
def get_sentiment(db: Session, user_id: str, skip: int = 0, limit: int = 100):
    return db.query(models.Sentiment).filter(models.Sentiment.user_id == user_id).order_by(models.Sentiment.created.desc()).offset(skip).limit(limit).all()

返回了一个错误:

web_1  | AttributeError: 'Session' object has no attribute 'cursor'

sessions函数如下所示:

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from environment.config import settings
SQLALCHEMY_DATABASE_URL = settings.DATABASE_URL
engine = create_engine(SQLALCHEMY_DATABASE_URL)
SessionLocal = sessionmaker(autocommit=False,autoflush=False,bind=engine)

我调用这个函数的main.py文件中有这些导入和辅助函数等。

from plistlib import UID
import string
from typing import Optional
from pandas import concat
from fastapi import FastAPI, HTTPException, Header,Depends
from fastapi.middleware.cors import CORSMiddleware
from pydantic import BaseModel
from db.session import SessionLocal
from db.biometric import sentimentDataframe,expressionDataframe,scheduledDataframe
from biometrics.TaskGet import GetSentiment, GetScheduled, GetAllActualSubstance, GetEmotions
import aggregate.biometric_aggregators as biometric_aggregators
import os
app = FastAPI()
def get_db():
    try:
        db = SessionLocal()
        yield db
    finally:
        db.close()
@app.get("/{uid}/{substance}/Emotions.json", status_code=200)
async def get_emotions(uid, substance,startDate:Optional[str] = None,endDate:Optional[str] = None, analysis:Optional[str] = None, emotion:Optional[str] = None, x_token: Optional[str] = Header(None, convert_underscores=False),db: SessionLocal = 
        Sentiment = sentimentDataframe(db,uid)
        Expressions = expressionDataframe(db,uid)

对我到底做错了什么感到困惑?

0
0 Comments

问题出现的原因是在使用FastAPI和ORM时,无法直接将查询结果转换为pandas的DataFrame。解决方法是通过使用pandas的read_sql函数来加载数据,并对查询结果进行处理以满足DataFrame的要求。

在给出的代码中,首先定义了一个名为sentimentDataframe的函数,它接受一个数据库会话对象和一个用户ID作为参数。该函数通过调用get_sentiment函数获取查询结果,并使用pandas的read_sql函数将查询结果转换为DataFrame。然后,通过调用pd.to_datetime函数将created列的数据转换为日期时间格式,并将其设置为DataFrame的索引。最后,返回处理后的DataFrame。

get_sentiment函数接受数据库会话对象和用户ID作为参数,并使用ORM进行查询操作。查询结果按照created列的降序排列,并通过offset和limit参数进行分页。最后,返回查询结果。

建议尝试以上代码,应该能正常工作。需要注意的是,以上代码没有经过测试,可能会存在一些问题。

本文介绍了在使用FastAPI和ORM时,如何将查询结果转换为pandas的DataFrame。通过调用pandas的read_sql函数加载数据,并对查询结果进行处理,可以满足DataFrame的要求。此外,还给出了一个示例代码,演示了如何在FastAPI中使用ORM和pandas来处理数据库查询结果。

0