与 sqlalchemy 窃听的 fastapi 会话

fastapi session with sqlalchemy bugging out

我正在使用 fastapi 创建一个基本的 API 来从 postgres 数据库中进行一些统计。

我刚开始使用 sqlalchemy,因为我想做连接池,根据我的谷歌搜索,我似乎走下坡路了。

我已经在我的 main.py 文件中实现了这个,

def get_db():
    try:
        db = SessionLocal()
        yield db
    finally:
        db.close()

然后使用依赖于 fastapi 和我的 URL 参数,

async def get_data(xxx ,db: SessionLocal = Depends(get_db)):
   conn = db()

有了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)

我收到 SessionLocal 不可调用的类型错误,想知道我在这里遗漏了什么吗?

我遇到的问题是在测试 API 是否被调用时,对 API 的多次调用本质上是重新创建与数据库的连接,这在本地测试时非常缓慢 - 所以想要做到这一点......很好的工作:)

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 biometrics.TaskGet import GetSentiment, GetScheduled, GetAllActualSubstance, GetEmotions

import aggregate.biometric_aggregators as biometric_aggregators

import os

根据下面的回答,我只是让它使用数据库。但是现在我奇怪地得到了这个错误。

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

使 sqlalchemy 函数执行相同的调用,现在得到与以前相同的错误。

我最初尝试只 return 函数而不使用 pd.read_sql,但它没有用 - 知道我在这里做错了什么吗?

from sqlalchemy.orm import Session

import pandas as pd

from . import models


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()

你不应该这样做

conn = db()

因为 db 已经是 session 的一个实例

你已经可以像这样使用了

db.add(<SQLAlchemy Base Instance>)
db.commit()