【问题标题】:Put method does not update the database but it shows 200 as a responsePut 方法不会更新数据库,但它显示 200 作为响应
【发布时间】:2022-01-17 10:23:06
【问题描述】:

我正面临 put 方法的问题,它显示 200 成功响应,但它没有在数据库上更新。

数据库.py:

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base

sql_database_url="mysql://root:zeehan@localhost:3306/mybookstore"
engine=create_engine(sql_database_url)
sessionLocal=sessionmaker(autocommit=False,bind=engine)
base=declarative_base()

这是我的数据库文件

main.py:

from typing import Optional
from fastapi import FastAPI,Query,Depends,Path,HTTPException
from sqlalchemy import Column,String,Integer,Float
from pydantic import BaseModel, errors
from sqlalchemy.orm import Session, query, session
from sqlalchemy import create_engine
from sqlalchemy.sql.schema import MetaData
from sqlalchemy import databases
from book_Database import engine,sessionLocal,base,sessionmaker
app=FastAPI()


class BookStore(base):
    __tablename__="mybookstore"
    id=Column(Integer,primary_key=True,index=True,autoincrement=True)
    name=Column(String(255),index=True)
    author=Column(String(225))
    rating=Column(Float)
    description=Column(String(225))

class BookStoreSchema(BaseModel):
    
    name:str
    author:str
    rating:float
    description:str
    
class BookStoreUpdateSchema(BaseModel):
    id=int
    name:str
    author:str 
    rating:float
    description:str
    
    class Config:
        orm_model=True

def get_bookdb():
    db=sessionLocal()
    try:
        yield db
    finally:
        db.close()        
       
base.metadata.create_all(bind=engine)

@app.get("/books")
def getstudent(db:Session=Depends(get_bookdb)):
    return db.query(BookStore).all() 

@app.get("/books/{id}")
def getstudent_by_name(id:int,db:Session=Depends(get_bookdb)):
    bookstore = db.query(BookStore).get(id)
    return bookstore 

@app.post("/create-book")
def creatBook(*,BookStoreSchema:BookStoreSchema,rating :float=Query( None,gt=0,lt=6)):
    bookstore = BookStore( name=BookStoreSchema.name,author=BookStoreSchema.author,rating=BookStoreSchema.rating  ,description=BookStoreSchema.description)
    with Session(bind=engine) as session:
        session.add(bookstore)
        session.commit()
   return bookstore

@app.put("/update-book/{id}")
def update_student(id:int,bookstore:BookStoreUpdateSchema,db:Session=Depends(get_bookdb)):
    bookstore = db.query(BookStore).get(id)
    BookStore.name = bookstore.name
    BookStore.author=bookstore.author
    BookStore.rating=bookstore.rating
    BookStore.description=bookstore.description
    db.commit()
    return bookstore

当我尝试使用 UVICorn 运行此 API 时,我运行成功,但 put 方法存在一些问题。它显示成功响应,但它不更新数据库的内容。

【问题讨论】:

    标签: python mysql rest fastapi put


    【解决方案1】:

    在您的 database.py 文件中,declarative_base() 返回一个类,因此 base 改为 Base

    Base = declarative_base()
    class BookStore(Base):
        pass
    

    在您的 createBook 函数的 main.py 文件中,首先尝试一些简单的操作:

    @app.post("/create-book")
    def creat_a_book(new_book: BookStoreSchema, db: Session = Depends(get_bookdb)):
        book = BookStore(**new_book())
        db.add(book)
        db.commit()
        db.refresh(book)
        return book
    

    在更新函数参数中更改更新书的变量名称,并在架构定义中将 orm_model 更改为 orm_mode 让我们称之为更新书

    试着像这样从书店拿你的书:

    bookstore = db.query(BookStore).filter(BookStore.id == id)
    

    并使用更新功能更新书籍

    bookstore.update(updated_book.dict(), synchronize_session=False)
    db.commit()
    

    【讨论】:

    • 我试过了,它显示内部服务器错误
    • 你能提供你的控制台的sn-p吗?
    • AttributeError: 'Query' 对象没有属性 'dict'
    • 您是否将更新路径函数中的参数名称更改为updated_book?看来您正在尝试将 dict() 与查询对象一起使用
    • defupdated_book(id:int,updated_book:BookStoreUpdateSchema,db:Session=Depends(get_bookdb)):
    猜你喜欢
    • 1970-01-01
    • 2020-10-03
    • 1970-01-01
    • 2015-12-25
    • 1970-01-01
    • 2016-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多