我正在try 使用SQLAlchemyFastAPI(async)从PostgreSQL表中检索数据.这是我的模型:

class LoginHistory(Base):
    __tablename__ = 'login_history'

    id = Column(
        UUID(as_uuid=True), primary_key=True,
        default=uuid.uuid4, unique=True, nullable=False
    )
    user_id = Column(UUID(as_uuid=True), ForeignKey('user.id'))
    user = relationship('User', back_populates='login_history')
    user_agent = Column(String(255))
    login_dt = Column(DateTime)

    def __init__(self, user_id: UUID, user_agent: str, login_dt: datetime) -> None:
        self.user_id = user_id
        self.login_dt = login_dt
        self.user_agent = user_agent

以下是用户服务的一段代码片段:

from typing import Annotated

from fastapi import Header, Request
from sqlalchemy import insert, select
from sqlalchemy.ext.asyncio import AsyncSession

from auth.src.models.entity import LoginHistory

async def get_login_history(
    authorization: Annotated[str, Header()],
    db: AsyncSession
) -> dict:
    result = await token_logic.get_token_authorization(authorization)
    if result.get('error'):
        return result
    access_token = result.get('token')
    user_id = await token_logic.get_user_id_by_token(access_token)
    query = select(LoginHistory).where(LoginHistory.user_id == user_id)
    history = await db.execute(query)
    login_history = history.fetchall()
    return {'success': [{
            'user_agent': record.user_agent,
            'login_dt': record.login_dt.isoformat()
    } for record in login_history]
    }

当我发出请求时,我得到一个错误:AttributeError: user_agent.据我所知,fetchall()方法应该返回一个包含Row个对象的列表,其中包含与表字段相关联的属性(在我的例子中,是user_agentlogin_dt等).我做错了什么?非常感谢您的回复.

我正在使用的版本:SQLAlchemy==2.0.16FastAPI==0.97.0asyncpg==0.27.0.

推荐答案

问题是,.fetchall()返回一个单元素元组列表,其中每个元素都是LoginHistory的一个实例:

[
    (<__main__.LoginHistory object at 0x7f43764f7590>,),
    (<__main__.LoginHistory object at 0x7f43764f7610>,)
]

因此,record.user_Agent for record in login_history将失败,因为元组没有useragent属性.

调用.scalars()而不是.fetchall()可以解决这个问题,因为.scalars()的目的恰恰是从结果中删除包装器元组.或者我们可以简单地做

login_history = await session.scalars(query)

并删除多余的history变量.

Python相关问答推荐

学习率未更新

无法获得指数曲线_fit来处理日期

在Windows上启动新Python项目的正确步骤顺序

请从Python访问kivy子部件的功能需要帮助

Pandas 在时间序列中设定频率

Image Font生成带有条形码Code 128的条形码时出现枕头错误OSErsor:无法打开资源

如何根据条件在多指标框架上进行groupby

计算所有前面行(当前行)中列的值

将HTML输出转换为表格中的问题

在Python中处理大量CSV文件中的数据

使可滚动框架在tkinter环境中看起来自然

什么相当于pytorch中的numpy累积ufunc

如果值发生变化,则列上的极性累积和

将9个3x3矩阵按特定顺序排列成9x9矩阵

在Python argparse包中添加formatter_class MetavarTypeHelpFormatter时, - help不再工作""""

在pandas中使用group_by,但有条件

Scrapy和Great Expectations(great_expectations)—不合作

在Django admin中自动完成相关字段筛选

改进大型数据集的框架性能

寻找Regex模式返回与我当前函数类似的结果