Advertisement
Guest User

Untitled

a guest
May 16th, 2023
115
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.01 KB | None | 0 0
  1. ==========================================
  2. crud.py
  3. ==========================================
  4.  
  5. from sqlalchemy.orm import Session
  6.  
  7. import models
  8. import schemas
  9.  
  10.  
  11. def get_user(db: Session, user_id: int):
  12.     return db.query(models.User).filter(models.User.id == user_id).first()
  13.  
  14.  
  15. def get_user_by_email(db: Session, email: str):
  16.     return db.query(models.User).filter(models.User.email == email).first()
  17.  
  18.  
  19. def get_users(db: Session, skip: int = 0, limit: int = 100):
  20.     return db.query(models.User).offset(skip).limit(limit).all()
  21.  
  22.  
  23. def create_user(db: Session, user: schemas.UserCreate):
  24.     fake_hashed_password = user.password + "notreallyhashed"
  25.     db_user = models.User(email=user.email, hashed_password=fake_hashed_password)
  26.     db.add(db_user)
  27.     db.commit()
  28.     db.refresh(db_user)
  29.     return db_user
  30.  
  31.  
  32. def get_items(db: Session, skip: int = 0, limit: int = 100):
  33.     return db.query(models.Item).offset(skip).limit(limit).all()
  34.  
  35.  
  36. def create_user_item(db: Session, item: schemas.ItemCreate, user_id: int):
  37.     db_item = models.Item(**item.dict(), owner_id=user_id)
  38.     db.add(db_item)
  39.     db.commit()
  40.     db.refresh(db_item)
  41.     return db_item
  42.  
  43.  
  44. ==========================================
  45. database.py
  46. ==========================================
  47.  
  48. from sqlalchemy import create_engine
  49. from sqlalchemy.ext.declarative import declarative_base
  50. from sqlalchemy.orm import sessionmaker
  51.  
  52. # https://stackoverflow.com/questions/25540711/docker-postgres-pgadmin-local-connection
  53. SQLALCHEMY_DATABASE_URL = "postgresql://postgres:admin@localhost:5432/db"
  54.  
  55. engine = create_engine(SQLALCHEMY_DATABASE_URL)
  56. SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
  57.  
  58. Base = declarative_base()
  59.  
  60.  
  61. ==========================================
  62. models.py
  63. ==========================================
  64.  
  65. from sqlalchemy import Boolean, Column, ForeignKey, Integer, String
  66. from sqlalchemy.orm import relationship
  67.  
  68. from .database import Base
  69.  
  70.  
  71. # Create the database models
  72.  
  73. class User(Base):
  74.     __tablename__ = "users"
  75.  
  76.     # Create model attributes/columns¶
  77.     id = Column(Integer, primary_key=True, index=True)
  78.     email = Column(String, unique=True, index=True)
  79.     hashed_password = Column(String)
  80.     is_active = Column(Boolean, default=True)
  81.  
  82.     # Create the relationships¶
  83.     items = relationship("Item", back_populates="owner")
  84.  
  85.  
  86. ==========================================
  87. schemas.py
  88. ==========================================
  89.  
  90. class Item(Base):
  91.     __tablename__ = "items"
  92.  
  93.     id = Column(Integer, primary_key=True, index=True)
  94.     title = Column(String, index=True)
  95.     description = Column(String, index=True)
  96.     owner_id = Column(Integer, ForeignKey("users.id"))
  97.  
  98.     owner = relationship("User", back_populates="items")
  99.  
  100.  
  101. from pydantic import BaseModel
  102.  
  103. # Create the Pydantic models
  104.  
  105.  
  106. class ItemBase(BaseModel):
  107.     title: str
  108.     description: str | None = None
  109.  
  110.  
  111. class ItemCreate(ItemBase):
  112.     pass
  113.  
  114.  
  115. class Item(ItemBase):
  116.     id: int
  117.     owner_id: int
  118.  
  119.     class Config:
  120.         orm_mode = True
  121.  
  122.  
  123. class UserBase(BaseModel):
  124.     email: str
  125.  
  126.  
  127. class UserCreate(UserBase):
  128.     password: str
  129.  
  130.  
  131. class User(UserBase):
  132.     id: int
  133.     is_active: bool
  134.     items: list[Item] = []
  135.  
  136.     class Config:
  137.         orm_mode = True
  138.  
  139.  
  140. ==========================================
  141. main.py
  142. ==========================================
  143.  
  144. from fastapi import Depends, FastAPI, HTTPException
  145. from sqlalchemy.orm import Session
  146.  
  147. from . import crud, models, schemas
  148. from .database import SessionLocal, engine
  149.  
  150. models.Base.metadata.create_all(bind=engine)
  151. #
  152. app = FastAPI()
  153.  
  154.  
  155. # Dependency
  156. def get_db():
  157.     db = SessionLocal()
  158.     try:
  159.         yield db
  160.     finally:
  161.         db.close()
  162.  
  163.  
  164. @app.post("/users/", response_model=schemas.User)
  165. def create_user(user: schemas.UserCreate, db: Session = Depends(get_db)):
  166.     db_user = crud.get_user_by_email(db, email=user.email)
  167.     if db_user:
  168.         raise HTTPException(status_code=400, detail="Email already registered")
  169.     return crud.create_user(db=db, user=user)
  170.  
  171.  
  172. @app.get("/users/", response_model=list[schemas.User])
  173. def read_users(skip: int = 0, limit: int = 100, db: Session = Depends(get_db)):
  174.     users = crud.get_users(db, skip=skip, limit=limit)
  175.     return users
  176.  
  177.  
  178. @app.get("/users/{user_id}", response_model=schemas.User)
  179. def read_user(user_id: int, db: Session = Depends(get_db)):
  180.     db_user = crud.get_user(db, user_id=user_id)
  181.     if db_user is None:
  182.         raise HTTPException(status_code=404, detail="User not found")
  183.     return db_user
  184.  
  185.  
  186. @app.post("/users/{user_id}/items/", response_model=schemas.Item)
  187. def create_item_for_user(
  188.     user_id: int, item: schemas.ItemCreate, db: Session = Depends(get_db)
  189. ):
  190.     return crud.create_user_item(db=db, item=item, user_id=user_id)
  191.  
  192.  
  193. @app.get("/items/", response_model=list[schemas.Item])
  194. def read_items(skip: int = 0, limit: int = 100, db: Session = Depends(get_db)):
  195.     items = crud.get_items(db, skip=skip, limit=limit)
  196.     return items
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement