使用ORM的FastAPI无法转换为pandas。
使用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)
对我到底做错了什么感到困惑?
问题出现的原因是在使用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来处理数据库查询结果。