• FastAPI 学习之路(三十四)数据库多表操作


            之前我们分享的是基于单个的数据库表的操作,我们在设计数据库的时候也设计了跨表,我们可以看下数据库的设计。

            

    class User(Base):
        __tablename__ = "users"
        id = Column(Integer, primary_key=True, index=True)
        email = Column(String, unique=True, index=True)
        hashed_password = Column(String)
        is_active = Column(Boolean, default=True)
        items = relationship("Item", back_populates="owner")
    
    class Item(Base):
        __tablename__ = "items"
        id = Column(Integer, primary_key=True, index=True)
        title = Column(String, index=True)
        description = Column(String, index=True)
        owner_id = Column(Integer, ForeignKey("users.id"))
        owner = relationship("User", back_populates="items")

      那么我们看下这对应的 pydantic模型如何进行创建。

    class ItemBase(BaseModel):
        title: str
        description: Optional[str] = None
    
    
    class ItemCreate(ItemBase):
        pass
    
    
    class Items(ItemBase):
        id: int
        owner_id: int
    
        class Config:
            orm_mode = True

            其实这里没有什么特别的,都是一些简单的配置。但是我们需要更新下用的pydantic模型

            

    from pydantic import BaseModel
    from typing import List,Optional
    class Users(UserBase):
        """
        响应模型:
        id:email: is_active并且设置orm_mode与之兼容
        """
        id: int
        is_active: bool
        items: List[Items] = []
        class Config:
            orm_mode = True

        增加对于items的适配。我们在操作数据库的地方也需要进行改造。

    def get_item(db: Session, skip: int = 0, limit: int = 100):
        return db.query(Item).offset(skip).limit(limit).all()
    
    
    # 新建用户的item
    def create_user_item(db: Session, item: ItemCreate, user_id: int):
        db_item = Item(**item.dict(), owner_id=user_id)
        db.add(db_item)
        db.commit()
        db.refresh(db_item)
        return db_item

    我们去增加两个接口,一个接口是创建item 一个是获取item

    #  所有item
    @app.get("/items/", response_model=List[Items])
    def read_items(skip: int = 0, limit: int = 0, db: Session = Depends(get_db)):
        items = get_item(db=db, skip=skip, limit=limit)
        return items
    
    
    # 创建用户的item
    @app.post("/users/{user_id}/items", response_model=Items)
    def create_item_user(user_id: int, item: ItemCreate, db: Session = Depends(get_db)):
        return create_user_item(db=db, item=item, user_id=user_id)

       我们去调试下。

    我们去查询下所有的items

      我们去开发一个接口,如何查询用户的items。

    #封装操作数据库
    def get_user_item(db:Session,userid:int):
        user=db.query(User).filter(User.id==userid).first()
        return  db.query(Item).filter(Item.owner==user).offset(1).limit(1).all()
    #封装接口
    @app.post("/user/item/{user_id}",response_model=List[Items])
    def get_user_items(user_id:int,db:Session=Depends(get_db)):
        return get_user_item(db=db,userid=user_id)

    我们测试下返回

     我们已经实现了简单的多表查询。

    文章首发在公众号,欢迎关注。

  • 相关阅读:
    php对接网易云信视频直播
    python基础--1.数据操作
    pytest自动化7:assert断言
    pytest自动化6:pytest.mark.parametrize装饰器--测试用例参数化
    pytest自动化5:pytest-html插件--生成html报告
    pytest自动化4:fixture之yield实现teardown
    pytest自动化3:fixture之conftest.py实现setup
    pytest自动化2:测试用例setup和teardown
    pytest自动化1:兼容unittest代码实例
    排序
  • 原文地址:https://www.cnblogs.com/leiziv5/p/15416797.html
Copyright © 2020-2023  润新知