FastAPI 学习之路(三十四)数据库多表操作
2023-03-15 22:52:00 时间
之前我们分享的是基于单个的数据库表的操作,我们在设计数据库的时候也设计了跨表,我们可以看下数据库的设计。
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)
我们测试下返回
我们已经实现了简单的多表查询。
文章首发在公众号,欢迎关注。
相关文章
- 从本体论开始说起——运营商关系图谱的构建及应用
- 如何成为一名数据科学家?
- 从未见过的堂兄杀了人,你的DNA是关键证据
- 20个安全可靠的免费数据源,各领域数据任你挑
- 20个安全可靠的免费数据源,各领域数据任你挑
- 阿里云李飞飞:All in Cloud时代,云原生数据库优势明显
- 基于Hadoop生态系统的一高性能数据存储格式CarbonData(性能篇)
- 大数据告诉你:10年漫威,到底有多少角色
- TigerGraph:实时图数据库助力金融风控升级
- Splunk利用Splunk Connected Experiences和Splunk Business Flow 扩大数据访问
- 大数据开发常见的9种数据分析手段
- 以免在景区看人,我爬了5W条全国景点门票数据...
- 【实战解析】基于HBase的大数据存储在京东的应用场景
- 数据科学家告诉你哪些计算机科学书籍是你应该看的
- Kafka作为大数据的核心技术,你了解多少?
- Spring Boot 整合 Redis 实现缓存操作
- 大数据学习必须掌握的五大核心技术有哪些?
- 基于Antlr在Apache Flink中实现监控规则DSL化的探索实践
- 甲骨文再次被Gartner评为分析型数据管理解决方案魔力象限领导者
- 爬取吴亦凡微博102118条转发数据,扒一扒流量的真假