fastapi 用什么 orm 好

FastAPI并没有对具体的ORM做出限制,你可以使用你喜欢的任何ORM。

常用的ORM有:

SQLAlchemy
Peewee
Tortoise-ORM
Pony ORM
Ormar
GINO
其中,SQLAlchemy 是比较常用的ORM,它不仅支持关系型数据库,还支持NoSQL数据库。FastAPI也有很好的支持。在FastAPI官方文档中也有使用SQLAlchemy的示例。如果你之前已经熟悉了SQLAlchemy,那么可以考虑在FastAPI中使用它。

如果你想使用异步ORM,Tortoise-ORM和GINO是不错的选择。Tortoise-ORM是一种基于asyncio和databases的ORM,使用类似Django的语法。GINO是基于SQLAlchemy core的异步ORM,可以在FastAPI中非常方便地使用。

在选择ORM时,你可以根据你的项目需求、熟悉程度和团队喜好等因素进行选择。


用 fastapi 结合 pony orm 写一套学生信息管理系统

下面是使用FastAPI结合Pony ORM的示例代码,实现学生信息的增删改查功能:

创建一个main.py文件,编写以下代码:

from fastapi import FastAPI, HTTPException
from pony.orm import Database, Required, Json
from pydantic import BaseModel

# 初始化Pony ORM
db = Database()

# 定义学生数据模型
class Student(db.Entity):
    name = Required(str)
    age = Required(int)
    address = Required(Json)

# 设置数据库连接
db.bind(provider='sqlite', filename='students.sqlite', create_db=True)
db.generate_mapping(create_tables=True)

# 初始化FastAPI
app = FastAPI()

# 定义输入数据模型
class StudentIn(BaseModel):
    name: str
    age: int
    address: dict

# 定义输出数据模型
class StudentOut(BaseModel):
    id: int
    name: str
    age: int
    address: dict

# 定义路由,获取学生列表
@app.get("/students")
def get_students():
    students = Student.select()
    return [StudentOut(id=s.id, name=s.name, age=s.age, address=s.address) for s in students]

# 定义路由,获取单个学生
@app.get("/students/{id}")
def get_student(id: int):
    student = Student.get(id=id)
    if not student:
        raise HTTPException(status_code=404, detail="Student not found")
    return StudentOut(id=student.id, name=student.name, age=student.age, address=student.address)

# 定义路由,新增学生
@app.post("/students")
def create_student(student: StudentIn):
    s = Student(name=student.name, age=student.age, address=student.address)
    db.commit()
    return StudentOut(id=s.id, name=s.name, age=s.age, address=s.address)

# 定义路由,更新学生
@app.put("/students/{id}")
def update_student(id: int, student: StudentIn):
    s = Student.get(id=id)
    if not s:
        raise HTTPException(status_code=404, detail="Student not found")
    s.name = student.name
    s.age = student.age
    s.address = student.address
    db.commit()
    return StudentOut(id=s.id, name=s.name, age=s.age, address=s.address)

# 定义路由,删除学生
@app.delete("/students/{id}")
def delete_student(id: int):
    s = Student.get(id=id)
    if not s:
        raise HTTPException(status_code=404, detail="Student not found")
    s.delete()
    db.commit()
    return {"message": "Student deleted successfully"}

# 运行FastAPI应用
if __name__ == "__main__":
    import uvicorn
    uvicorn.run(app, host="0.0.0.0", port=8000)

这个示例代码中,我们使用Pony ORM来定义学生数据模型,并创建了一个SQLite数据库来存储数据。我们使用FastAPI来定义路由和输入/输出数据模型,实现了学生信息的增删改查功能。

启动应用后,可以通过http://localhost:8000/docs查看API文档


用 fastapi 结合 sqlalchemy 写一套学生信息管理系统

from typing import List
from fastapi import FastAPI, HTTPException
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

# 创建 SQLAlchemy 引擎和会话工厂
SQLALCHEMY_DATABASE_URL = "postgresql://user:password@localhost/database"
engine = create_engine(SQLALCHEMY_DATABASE_URL)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)

# 创建 SQLAlchemy 声明基类
Base = declarative_base()

# 定义 Student 模型
class Student(Base):
    __tablename__ = "students"

    id = Column(Integer, primary_key=True, index=True)
    name = Column(String, index=True)
    age = Column(Integer)
    email = Column(String, unique=True, index=True)

# 创建 FastAPI 应用
app = FastAPI()

# 获取数据库会话
def get_db():
    db = SessionLocal()
    try:
        yield db
    finally:
        db.close()

# 定义创建学生的 API
@app.post("/students/", response_model=Student)
def create_student(student: Student, db: Session = Depends(get_db)):
    db.add(student)
    db.commit()
    db.refresh(student)
    return student

# 定义获取所有学生的 API
@app.get("/students/", response_model=List[Student])
def get_students(skip: int = 0, limit: int = 100, db: Session = Depends(get_db)):
    students = db.query(Student).offset(skip).limit(limit).all()
    return students

# 定义获取单个学生的 API
@app.get("/students/{student_id}", response_model=Student)
def get_student(student_id: int, db: Session = Depends(get_db)):
    student = db.query(Student).filter(Student.id == student_id).first()
    if not student:
        raise HTTPException(status_code=404, detail="Student not found")
    return student

# 定义更新学生的 API
@app.put("/students/{student_id}", response_model=Student)
def update_student(student_id: int, student: StudentUpdate, db: Session = Depends(get_db)):
    db_student = db.query(Student).filter(Student.id == student_id).first()
    if not db_student:
        raise HTTPException(status_code=404, detail="Student not found")
    for var, value in vars(student).items():
        if value is not None:
            setattr(db_student, var, value)
    db.commit()
    db.refresh(db_student)
    return db_student

# 定义删除学生的 API
@app.delete("/students/{student_id}")
def delete_student(student_id: int, db: Session = Depends(get_db)):
    db_student = db.query(Student).filter(Student.id == student_id).first()
    if not db_student:
        raise HTTPException(status_code=404, detail="Student not found")
    db.delete(db_student)
    db.commit()
    return {"message": "Student deleted"}

上面的代码中,我们使用 create_engine 函数创建一个 SQLAlchemy 引擎,并使用 sessionmaker 函数创建一个会话工厂。然后我们定义了一个 Student 模型,其中包含了学生的姓名、年龄和电子邮件地址。


下面是使用 FastAPI 和 Tortoise-ORM 写一套学生信息管理系统的示例代码:

from fastapi import FastAPI, HTTPException
from tortoise.contrib.fastapi import register_tortoise
from tortoise.fields import IntField, CharField, DateField
from tortoise.models import Model


# Define a student model using Tortoise-ORM
class Student(Model):
    id = IntField(pk=True)
    name = CharField(max_length=50)
    birth_date = DateField()

    class Meta:
        table = "students"


# Create a FastAPI instance
app = FastAPI()


# Add endpoint for creating a new student
@app.post("/students")
async def create_student(name: str, birth_date: date):
    student = await Student.create(name=name, birth_date=birth_date)
    return {"id": student.id, "name": student.name, "birth_date": student.birth_date}


# Add endpoint for getting a student by id
@app.get("/students/{student_id}")
async def get_student(student_id: int):
    student = await Student.filter(id=student_id).first().values()
    if not student:
        raise HTTPException(status_code=404, detail="Student not found")
    return student


# Add endpoint for getting all students
@app.get("/students")
async def get_all_students():
    students = await Student.all().values()
    return students


# Register the Tortoise-ORM models with FastAPI
register_tortoise(
    app,
    db_url="sqlite://db.sqlite3",
    modules={"models": ["main"]},
    generate_schemas=True,
    add_exception_handlers=True,
)

大家可以简单的感受一下几种ORM库的区别

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

推荐阅读更多精彩内容