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)

我們測試下返回

 

 我們已經實現了簡單的多表查詢。

文章首發在公眾號,歡迎關注。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM