【问题标题】:AttributeError: 'Session' object has no attribute 'session'AttributeError:“会话”对象没有属性“会话”
【发布时间】:2023-03-26 13:28:01
【问题描述】:

我正在创建一个端点,它将使用带有 python 的 fastApi 实现反转。我有一个端点,它通过 post 请求接收一个 id 并在事务模型上调用一个反向函数。但我收到错误 AttributeError: 'Session' object has no attribute 'session' on 'db.session.add(transaction)' 。我不确定这是从哪里来的。

交易模型

class Transaction(Base):
    __tablename__ = "transactions"
    id = Column(Integer, primary_key=True, index=True)
    uuid = Column(UUID(as_uuid=True), nullable=False, default=uuid.uuid4)
    amount = Column(Numeric(18, 2))
    type = Column(
        Enum(TransactionTypes, name="transaction_trans_types"), nullable=False
    )
    wallet_type = Column(
        Enum(WalletTypes, name="transaction_wallet_types"), nullable=False
    )
    created_when = Column(DateTime(timezone=True), server_default=func.now())
    payment_ref = Column(String, nullable=False)
    running_balance = Column(Numeric(18, 2))
    currency = Column(String, default="KES")
    notes = Column(String)
    paid_by = Column(UUID(as_uuid=True), ForeignKey("patients.uuid"), nullable=True,)
    patient_uuid = Column(UUID(as_uuid=True), ForeignKey("patients.uuid"))
    wallet_uuid = Column(UUID(as_uuid=True), ForeignKey("wallets.uuid"))
    paid_by_names = Column(String)

    def reverse(self,db: Session,notes:str =None,):
        transaction =Transaction(amount =self.amount,type= self.type,wallet_type = self.wallet_type,payment_ref = self.payment_ref,
        notes= notes )
        
        db.session.add(transaction)
        db.session.commit()
        db.session.refresh(transaction)

        reversal = Reversal(transaction_uuid=transaction.uuid,reversed_transaction_uuid= self.reversed_transaction_uuid)
        db.session.add(reversal)
        db.session.commit()
        db.session.refresh(reversal)

        return transaction

反转模型

class Reversal(Base):
    __tablename__ = "reversals"  
    id = Column(Integer, primary_key=True, index=True)
    transaction_uuid = Column(UUID(as_uuid=True), ForeignKey("transactions.uuid"))
    reversed_transaction_uuid = Column(UUID(as_uuid=True),ForeignKey("transactions.uuid"))

    __table_args__ = (
        UniqueConstraint("reversed_transaction_uuid"),
    )

端点

@router.post("/{transaction_id}/reverse",)   
async def reverse_transaction(
    *,
    db: Session = Depends(deps.get_db),
    transaction_id: int,
    current_user: models.User = Depends(deps.get_current_active_user),
) -> Any:
    """
    Reverse transaction
    """ 
    if not current_user.is_superuser:
        raise HTTPException(
            status_code=status.HTTP_403_FORBIDDEN,
            detail="Not allowed to reverse transactions",
        )
    try:
        transaction = (
            db.query(Transaction).filter(Transaction.id == transaction_id).scalar()
        )
   
        transaction.reverse(db,transaction)
    except NoResultFound:
        raise HTTPException(
            status_code=status.HTTP_404_NOT_FOUND, detail="Not found",
        )    

    return transaction    

这是我的 deps.db

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

【问题讨论】:

    标签: python sqlalchemy fastapi


    【解决方案1】:

    最重要的部分是看看deps.get_db() 的样子。

    但我猜根据你的类型提示,这已经给了你一个 Session。因此,在您的 reverse 方法中不要使用 db.session,而只需使用 db

    【讨论】:

    • 我已经添加了我的 deps.db
    猜你喜欢
    • 2011-03-15
    • 2020-03-26
    • 1970-01-01
    • 1970-01-01
    • 2011-12-22
    • 2019-05-03
    • 2016-09-17
    • 2013-05-27
    • 2021-02-22
    相关资源
    最近更新 更多