fastapi 简单使用

1. create database.py

from sqlalchemyimport create_engine

from sqlalchemy.ext.declarativeimport declarative_base

from sqlalchemy.ormimport sessionmaker

# SQLALCHEMY_DATABASE_URL = "sqlite:///./sql_app.db"

SQLALCHEMY_DATABASE_URL ="mysql://root:123456@localhost:3306/sqlalchemy_test"

# SQLALCHEMY_DATABASE_URL = "postgresql://user:password@postgresserver/db"

engine = create_engine(

SQLALCHEMY_DATABASE_URL

)

SessionLocal = sessionmaker(autocommit=False,autoflush=False,bind=engine)

Base = declarative_base()


2.  create crud.py

from sqlalchemyimport column

from sqlalchemy.ormimport Session

import models

import schemas

def get_user(db: Session, user_id:int):

return db.query(models.User).filter(column("id") == user_id).first()

def get_user_by_email(db: Session, email:str):

return db.query(models.User).filter(column("email") == email).first()

def get_users(db: Session, skip:int =0, limit:int =100):

return db.query(models.User).offset(skip).limit(limit).all()

def create_user(db: Session, user: schemas.UserCreate):

fake_hashed_password = user.password +"notreallyhashed"

    db_user = models.User(email=user.email,hashed_password=fake_hashed_password)

db.add(db_user)

db.commit()

db.refresh(db_user)

return db_user

def get_items(db: Session, skip:int =0, limit:int =100):

return db.query(models.Item).offset(skip).limit(limit).all()

def create_user_item(db: Session, item: schemas.ItemCreate, user_id:int):

db_item = models.Item(**item.dict(),owner_id=user_id)

db.add(db_item)

db.commit()

db.refresh(db_item)

return db_item


3.  create models.py

from sqlalchemyimport Boolean, Column, ForeignKey, Integer, String,Text

from sqlalchemy.ormimport relationship

from databaseimport Base

class User(Base):

__tablename__ ="users"

    id = Column(Integer,primary_key=True,index=True)

email = Column(String(80),unique=True,index=True)

hashed_password = Column(String(100))

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(255),index=True)

description = Column(Text)

owner_id = Column(Integer, ForeignKey("users.id"))

owner = relationship("User",back_populates="items")


4.  create schemas.py

from typingimport Union

from pydanticimport BaseModel

class ItemBase(BaseModel):

title:str

    description: Union[str,None] =None

class ItemCreate(ItemBase):

pass

class Item(ItemBase):

id:int

    owner_id:int

    class Config:

from_attributes =True

class UserBase(BaseModel):

email:str

class UserCreate(UserBase):

password:str

class User(UserBase):

id:int

    is_active:bool

    items:list[Item] = []

class Config:

from_attributes =True


5.  create main app

from fastapiimport Depends, FastAPI, HTTPException

from sqlalchemy.ormimport Session

import crud

import models

import schemas

from databaseimport SessionLocal, engine

models.Base.metadata.create_all(bind=engine)

app = FastAPI()

# Dependency

def get_db():

db = SessionLocal()

try:

yield db

finally:

db.close()

@app.post("/users/",response_model=schemas.User)

def create_user(user: schemas.UserCreate, db: Session = Depends(get_db)):

db_user = crud.get_user_by_email(db,email=user.email)

if db_user:

raise HTTPException(status_code=400,detail="Email already registered")

create_user = crud.create_user(db=db,user=user)

print(type(create_user))

return create_user

@app.get("/users/",response_model=list[schemas.User])

def read_users(skip:int =0, limit:int =100, db: Session = Depends(get_db)):

users = crud.get_users(db,skip=skip,limit=limit)

return users

@app.get("/users/{user_id}",response_model=schemas.User)

def read_user(user_id:int, db: Session = Depends(get_db)):

db_user = crud.get_user(db,user_id=user_id)

if db_useris None:

raise HTTPException(status_code=404,detail="User not found")

return db_user

@app.post("/users/{user_id}/items/",response_model=schemas.Item)

def create_item_for_user(

user_id:int, item: schemas.ItemCreate, db: Session = Depends(get_db)

):

return crud.create_user_item(db=db,item=item,user_id=user_id)

@app.get("/items/",response_model=list[schemas.Item])

def read_items(skip:int =0, limit:int =100, db: Session = Depends(get_db)):

items = crud.get_items(db,skip=skip,limit=limit)

return items


注意点: @app.get("/users/",response_model=list[schemas.User])   

                @app.post("/users/",response_model=schemas.User) 

如果结果有多个对象,response_model 需要是 List


fastapi  数据库查询出来的 对象和 list<Obj>  可以正常序列化, 而 flask 和 django 都需要 转字典或者序列化器

比如:

@app.post("/students/", )# response_model=schemas.StudentDetail

def create_student(stu: schemas.StudentCreate, db: Session = Depends(get_db)):

db_stu = crud.get_student_by_name(db,user_name=stu.user_name)

if db_stu:

raise HTTPException(status_code=400,detail="user name already registered")

result = crud.create_stu(db=db,stu=stu)

return {'code':200,'data': result}

@app.get("/students/", )# response_model=list[schemas.StudentDetail]

def get_student(skip:int =0, limit:int =100, db: Session = Depends(get_db)):

sts = crud.get_students(db,skip=skip,limit=limit)

return {'code':200,'data': sts}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,324评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,356评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,328评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,147评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,160评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,115评论 1 296
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,025评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,867评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,307评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,528评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,688评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,409评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,001评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,657评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,811评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,685评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,573评论 2 353

推荐阅读更多精彩内容