基于FastApi框架测试平台(3)-配置SQLAlchemy

785 阅读3分钟

安装SQLAlchemy

pip install sqlalchemy

配置MySQL连接信息

这里我们将连接信息写在配置文件中core/config/dev_config.py

class Settings(BaseSettings):
    MYSQL_USERNAME: str = "root"
    MYSQL_PASSWORD: str = "12345678"
    MYSQL_HOST: Union[AnyHttpUrl, IPvAnyAddress] = "127.0.0.1"
    MYSQL_PORT: int = 3306
    MYSQL_DATABASE: str = 'test_craft'
​
    SQLALCHEMY_DATABASE_URL = f"mysql+pymysql://{MYSQL_USERNAME}:{MYSQL_PASSWORD}@" \
                              f"{MYSQL_HOST}/{MYSQL_DATABASE}?charset=utf8mb4"

创建 SQLAlchemy 引擎

这里我们将引擎创建在db/session.py文件中

创建一个 SQLAlchemy的“引擎”

我们稍后会将这个engine在其他地方使用。

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
Base = declarative_base()
from apps.core.config import settings
​
engine = create_engine(settings.SQLALCHEMY_DATABASE_URL, pool_pre_ping=True)

create_engine 函数创建了一个连接数据库的 Engine 对象。

pool_pre_ping=True 表示开启了数据库连接池的预检测功能,使得当一个连接从连接池中取出来使用时,会在使用此连接之前先 ping 一下该连接是否有效。如果连接已经断开,则会自动重新建立连接。

Engine 对象是 SQLAlchemy 的核心对象,它负责与数据库建立连接,并提供给我们处理数据库的接口。通过 Engine 可以获得 Session、MetaData、Table 等其他核心对象的引用。通常情况下,我们只需要创建一个 Engine 即可。

创建一个SessionLocal

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

sessionmaker 的作用是创建一个 session 类。Session 代表了数据库上下文环境中的一次会话,提供了对该环境的访问和控制。sessionmaker 是一个工厂函数,返回一个 session 类,通过这个类实例化出具体的 session 实例。

在这行代码中,SessionLocal 就是使用 sessionmaker 创建的一个用于操作数据库的 session 类。

autocommit=Falseautoflush=False 分别表示在对数据库做增删改操作时,不自动提交事务(通常需要手动调用 commit()),以及不自动刷新 session 对象缓存(通常需要手动调用 flush())。

bind=engine 参数表示将 session 与一个 database engine 绑定,即设置哪个 engine 来为 SessionLocal 提供操作数据库的接口。此处的 engine 可以通过 SQLAlchemy 的 create_engine 函数来创建。

创建一个Base类

我们将使用declarative_base()返回一个类。

稍后我们将用这个类继承,来创建每个数据库模型或类(ORM 模型)

Base = declarative_base()

ORM(Object-Relational Mapping)是一种编程技术,它将数据库表映射为 Python 对象,使得我们可以像操作对象一样操作数据库。通过继承 Base,我们可以将 ORM 类的定义简化为普通的 Python 类的形式,并且 Base 会自动为我们创建相应的表和字段。

创建数据库模型

用Base类创建SQLAlchemy模型

models/user.py

class User(Base):
    __tablename__ = "users"
​
    id = Column(INT, primary_key=True)
    username = Column(String(16), unique=True, index=True)
    password = Column(String(32), unique=False)
    created_at = Column(DATETIME, nullable=False)
    updated_at = Column(DATETIME, nullable=False)
    deleted_at = Column(DATETIME)
    last_login_at = Column(DATETIME)
​

创建Pydantic模型

schemas/user.py

from pydantic import BaseModel, validator
​
​
class UserBase(BaseModel):
    username: strclass UserCreate(UserBase):
    password: strclass User(UserBase):
    id: int
​
    class Config:
        orm_mode = True

CRUD工具

实现简单登录功能

服务层实现核心逻辑,与数据库进行交互。

service/user_service.py

class UserService(object):
​
    @staticmethod
    def login(username, password):
        try:
            with SessionLocal() as session:
                user = session.query(User).filter_by(username=username, password=password).first()
                if user is None:
                    return None, "用户名或密码错误"
                user.last_login_at = datetime.now()
                session.commit()
                session.refresh(user)
                return user, None
        except Exception as e:
            return None, str(e)