与 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()
我正在使用 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()