FastAPI-数据库和ORM(一)

2023-05-07 21:14:51 浏览数 (3)

FastAPI 是一个用于构建 Web 应用程序的 Python 框架。它在许多方面都比其他框架快,具有简洁的语法和易于使用的工具。其中包括与数据库交互的工具,即 ORM(对象关系映射)。

ORM 是一种编程模式,它将数据库中的数据转换为 Python 中的对象,并允许开发者使用 Python 代码直接访问数据库,而无需编写 SQL 查询。FastAPI 内置了多个 ORM 工具,例如 SQLAlchemy 和 Tortoise ORM。

SQLAlchemy

SQLAlchemy 是一个广泛使用的 Python ORM 框架,它提供了许多用于管理数据库的工具。它支持多种数据库引擎,并提供灵活的查询语言和完整的事务支持。

使用 SQLAlchemy 连接数据库有几个步骤。首先,需要安装 SQLAlchemy:

代码语言:javascript复制
pip install sqlalchemy

然后,需要创建一个数据库引擎,指定要使用的数据库类型、用户名、密码、主机和端口:

代码语言:javascript复制
from sqlalchemy import create_engine

SQLALCHEMY_DATABASE_URL = "postgresql://user:password@postgresserver/db"
engine = create_engine(SQLALCHEMY_DATABASE_URL)

在这个示例中,我们使用的是 PostgreSQL 数据库,其中 userpassword 是要用于连接数据库的用户名和密码,postgresserver 是数据库主机名,db 是要连接的数据库名。

接下来,需要创建一个会话工厂来管理与数据库的交互。会话是一个可以执行多个查询的单个数据库连接。创建会话工厂需要使用 sessionmaker 工具:

代码语言:javascript复制
from sqlalchemy.orm import sessionmaker

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

现在可以使用 SessionLocal 实例来打开新的数据库会话:

代码语言:javascript复制
db = SessionLocal()

在 FastAPI 中使用 SQLAlchemy 进行 CRUD 操作与使用原生 SQL 相同。只需要定义数据库模型类,然后使用会话实例进行操作。例如,以下是一个使用 SQLAlchemy 定义用户模型的示例:

代码语言:javascript复制
from sqlalchemy import Column, Integer, String
from sqlalchemy.orm import relationship

class User(Base):
    __tablename__ = "users"

    id = Column(Integer, primary_key=True, index=True)
    username = Column(String, unique=True, index=True)
    email = Column(String, unique=True, index=True)
    password = Column(String)
    is_active = Column(Boolean, default=True)

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

这个模型类定义了一个 User 类,它映射到一个名为 users 的数据库表。表中有几个列,包括 idusernameemailpasswordis_active。此外,它还定义了一个名为 items 的反向关系,它与 Item 模型类相关联。

使用 db 实例进行 CRUD

操作很简单。例如,以下代码向数据库中插入一个新用户:

代码语言:javascript复制
from sqlalchemy.orm import Session
from . import models, schemas

def create_user(db: Session, user: schemas.UserCreate):
    hashed_password = get_password_hash(user.password)
    db_user = models.User(username=user.username, email=user.email, password=hashed_password)
    db.add(db_user)
    db.commit()
    db.refresh(db_user)
    return db_user

这个函数接受一个数据库会话和一个 UserCreate 对象,并将其转换为一个 User 对象。然后,它使用会话实例将该用户添加到数据库中。最后,它将 db_user 对象刷新以获取与数据库中的实际行匹配的所有值,并将其返回。

0 人点赞