安装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=False 和 autoflush=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: str
class UserCreate(UserBase):
password: str
class 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)