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


    通过创建pydantic模型进行验证提交数据

    我们去通过传入数据库连接以及参数等进行数据库操作,包括创建用户、查询用户等,返回的是orm模型对象。

    接下来,我们就是在实际的接口中调用

    1. from sqlalchemy import create_engine, ForeignKey
    2. from sqlalchemy.ext.declarative import declarative_base
    3. from sqlalchemy.orm import sessionmaker, relationship
    4. from sqlalchemy import Column, Integer, String, Boolean
    5. mysql_url = "mysql+pymysql://{username}:{password}@{host}:{port}/{database}?charset=utf8".format(
    6. username="root", password="xxxxx;;", host="xxxxx", port=3306, database="sqlalchemy_db")
    7. # SQLALCHEMY_DATABASE_URL = "sqlite:///.test.db"
    8. engine = create_engine(
    9. mysql_url,
    10. # SQLALCHEMY_DATABASE_URL,
    11. # connect_args 参数只有sqlite才有
    12. # connect_args = {
    13. # "check_same_thread": False
    14. # }
    15. )
    16. # 该类的每个实例都是一个数据库会话,该类本身还不是数据库会话,但是一旦我们创建了SessionLocal的实例,这个实例将是实际的数据库会话
    17. SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
    18. # 创建数据库基类
    19. Base = declarative_base()
    20. # 创建两个数据库模型,继承自Base基类
    21. class User(Base):
    22. __tablename__ = "users"
    23. id = Column(Integer, primary_key=True, index=True)
    24. email = Column(String(20), unique=True, index=True)
    25. hashed_password = Column(String(20))
    26. is_active = Column(Boolean, default=True)
    27. items = relationship("Item", back_populates="owner")
    28. class Item(Base):
    29. __tablename__ = "items"
    30. id = Column(Integer, primary_key=True, index=True)
    31. title = Column(String(10), index=True)
    32. description = Column(String(10), index=True)
    33. owner_id = Column(Integer, ForeignKey("users.id"))
    34. owner = relationship("User", back_populates="items")
    35. # 那么我们如何将该模型对应到数据库表呢? 很简单
    36. # Base.metadata.create_all(bind=engine)
    37. #___________________________________________
    38. from pydantic import BaseModel
    39. from sqlalchemy.orm import Session
    40. class UserBase(BaseModel):
    41. email: str
    42. class UserCreate(UserBase):
    43. """请求验证模型"""
    44. password: str
    45. class Users(UserBase):
    46. """响应模型"""
    47. id: int
    48. is_active: bool
    49. class Config:
    50. orm_mode = True
    51. def get_user(db: Session, user_id: int):
    52. """通过id查询用户"""
    53. return db.query(User).filter(User.id == user_id).first()
    54. def db_create_user(db: Session, user: UserCreate):
    55. """创建用户"""
    56. fake_hashed_password = user.password + "falsehash"
    57. print(">>>>>", user, fake_hashed_password)
    58. db_user = User(email=user.email, hashed_password=fake_hashed_password)
    59. db.add(db_user)
    60. db.commit() # 提交保存到数据库中
    61. db.refresh(db_user)
    62. return db_user
    63. # 创建一个依赖
    64. def get_db():
    65. """每一个请求处理完毕后会关闭当前连接,不同的请求使用不同的连接"""
    66. db = SessionLocal()
    67. try:
    68. yield db
    69. finally:
    70. db.close()
    71. from fastapi import FastAPI, Depends, HTTPException
    72. app = FastAPI()
    73. @app.post("/users", response_model=Users)
    74. def create_user(user: UserCreate, db: Session = Depends(get_db)):
    75. """创建用户接口"""
    76. return db_create_user(db=db, user=user)
    77. @app.get("/users/{user_id}", response_model=Users)
    78. def read_user(user_id: int, db: Session = Depends(get_db)):
    79. db_user = get_user(db=db, user_id=user_id)
    80. if not db_user:
    81. raise HTTPException(status_code=404, detail="user not exists")
    82. return db_user
    83. if __name__ == '__main__':
    84. import uvicorn
    85. uvicorn.run("main:app", debug=True)

    我们去用postman去请求下创建下用户

    查询下账户

     我们去查询不存在的id

  • 相关阅读:
    UJNOJ_1287-1293-水题
    七天学会C语言-第六天(指针)
    uniapp websocket原生服务(自动重连、心跳检测) Ba-Websocket
    知乎高赞:听说Rust要取代C++?
    嵌入式 Linux LED 驱动开发实验学习
    java计算机毕业设计学生社团管理与评价系统源码+系统+lw+数据库+调试运行
    免交互一键部署NFS
    【Pandas数据处理100例】(九十九):Pandas使用at_time()筛选出特定时间点的数据行
    hive location更新&hive元数据表详解
    oracle基础-多表关联查询 备份
  • 原文地址:https://blog.csdn.net/myli_binbin/article/details/126671722