前言
本节运行一个简单的Demo,了解下简单的项目结构。
由于非常缺乏后端知识可能会记录一些相关名词的解释,也请大佬赐教;至于觉得碎碎念,请包容[doge]。
Demo结构说明
Demo主要展示从数据库到接口请求的简单过程。
下图是对Demo结构的简单说明,不代表成熟后端的结构。
从下到上依次是
数据库服务:提供持久化数据服务
models(映射数据库的表结构,属性完全和数据库表中的一样)
crud(对数据的增删改查)
schemas(对数据的规划,说人话就是数据库中对表的一种遮遮掩掩,给对方想看到的数据;比如在首页的文章推荐中,一条文章推荐只包含标题、简介、作者等信息,点到文章页面才有完整的数据)
main(main当中在实例里负责与客户端交互,花式提供数据服务)
数据库服务
代码跑起来
fastapi用了sqlachemy。Python中最有名的ORM框架,ORM对象关系映射,简单点说就是把对数据库的表映射到对象上,对数据库的操作也映射到对象上,不用写很多随业务逻辑变化而增加的sql代码。
所以只用配置好数据库服务、设计好数据表就能直接使用,不用编写sql脚本。
第一步配置数据库服务,这里使用SQLite(SQLite 教程 SQLite 是一个软件库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。),只需简单配置就可以直接使用的数据库服务;之后可以使用其他稍大型的数据库服务如myslq、postgresql等。
展示代码,其中有较为详细的注释
代码结构,由5个文件组成。
1.database.py
2.models.py
3.schemas.py
4.crud.py
5.main.py
#database.py
此部分用来设置数据库服务,以及产生操作数据库所用的会话。
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
# 数据库服务配置
DATABASE_URL = "sqlite:///./test.db"
# 创建数据引擎(对连接池和数据库方言的管理维护)
engine = create_engine(
DATABASE_URL , connect_args={"check_same_thread": False}
)
# 获取数据库会话maker也就是负责生成会话的
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
# 与数据库表一至的所有models的父类,完成table与model类之间的映射
# declarative_base工厂方法构造的声明系统
Base = declarative_base()
# Dependency,依赖,也就是每次都需要,每次经过此方法就产生一个db会话
# 之后在操作数据库时会用到
def get_db():
try:
db = SessionLocal()
yield db
finally:
db.close()
#models.py
相当于数据库中表的结构
此处就一个很简单的表结构
之后的教程中有更复杂的表结构
每个model类其实就对应了一个数据库中的一张表
from sqlalchemy import Column, Integer, String
# 从database中获取Base基类
from test.database import Base
# One表的model类
class One(Base):
# 表名为one
__tablename__ = "one"
# id字段,int类型,设置为主键,设置为索引
id = Column(Integer, primary_key=True, index=True)
# name字段,长度为50的字符串,默认值为gouzi
name = Column(String(50), default="gouzi")
下图是运行代码后自动生成的,不需要创建表,当把所有代码写完运行后就会生成。
#schemas.py
from pydantic import BaseModel
# 此视图用来创建一条one记录
# 因为插入一条新记录时id是数据库自动生成的,所以创建一条记录时无需id
class CreateOne(BaseModel):
name: str
class Config:
# 用来说明是orm模型
orm_mode = True
# 拥有全部字段的one模型,可用来更新,也可以查询时使用
class One(CreateOne):
id: int
#crud.py
crud主要汇聚了一堆增删改查操作
此处只有查询和插入,后续再展示更多操作
from sqlalchemy.orm import Session
from test import models, schemas
# 根据id查出一条记录
def get_one(db: Session, id: int):
# 用id来过滤出one表中的一条记录
return db.query(models.One).filter(models.One.id == id).first()
# 获得一组one记录
def get_ones(db: Session, skip: int = 0, limit: int = 100):
# 获得从skip到skip+limit的一组one记录
return db.query(models.One).offset(skip).limit(limit).all()
# 创建one表中的一条记录,也就是插入一条数据
def create_one(db: Session, user: schemas.CreateOne):
# 将传入的user映射到一个one模型里
db_user = models.One(**user.dict())
# 向数据库中添加一条记录
db.add(db_user)
# 提交我们对数据的操作
db.commit()
# 刷新一下
db.refresh(db_user)
return db_user
#main.py
此处主要汇聚一些可以和客户端交互的接口
而这些接口处理逻辑时,会用到以上所示的代码
from typing import List
from fastapi import Depends, FastAPI
from sqlalchemy.orm import Session
from test import schemas, crud
from test.database import engine, Base, get_db
# 将元数据创建一下,此时可将model对应的书库表创建好
Base.metadata.create_all(bind=engine)
# 创建一个FastAPI实例
app = FastAPI()
# 创建一条记录,使用post方法,路由为/one/
@app.post("/one/", response_model=schemas.CreateOne)
def create_user(one: schemas.CreateOne, db: Session = Depends(get_db)):
db_user = crud.create_one(db, one)
return db_user
# 查询一组one记录
@app.get("/ones/", response_model=List[schemas.One])
def read_users(skip: int = 0, limit: int = 100, db: Session = Depends(get_db)):
ones = crud.get_ones(db, skip=skip, limit=limit)
return ones
# 根据id查询一条记录
@app.get("/one/", response_model=schemas.One)
def read_user(id: int, db: Session = Depends(get_db)):
one = crud.get_one(db, id)
return one
if __name__ == '__main__':
import uvicorn
# 使用uvicorn创建我们的服务
uvicorn.run(app, host="127.0.0.1", port=8000)
运行代码
代码走起>
我是用pycharm开发的,配置下就可直接跑起来
配置大概长这个样子,随便配下就可以
打开浏览器就可使用swagger式的接口文档了,还可以直接访问接口
另外还有一种格式的接口文档,访问http://127.0.0.1:8000/redoc
点开每个请求
可以直接发送请求