FastAPI: 数据库-ORM安装和连接数据库

5 阅读2分钟

ORM安装

1.安装sqlalchemy

通过以下命令安装

$ pip insatll "sqlalchemy[asyncio]"
$ uv add "sqlalchemy[asyncio]"

将会安装异步版本的sqlalchemy

然后再安装aiomysql驱动

# 同步: mysqlclient
# 异步: siomysql
$ pip install aiomysql
$ uv add aiomysql

2.安装cryptography

使用python连接mysql需要用cryptography对密码进行加密

$ pip install cryptography
$ uv add cryptography

2.连接数据库

1.连接数据库配置

DB_URI ="mysql+aiomysql://用户名:密码@主机名:端口号/数据库名?charset=utf8mb4"

2.创建Engine对象

SQLAlchemy中的Engine对象,它负责管理数据库连接的创建(并不直接操作数据库), 连接池的维护,SQL语句的翻译等,Engine对象在整个程序中只能有一个.

代码:

from sqlalchemy.ext.asyncio import create_async_engine

from app.settings import DB_URI

engine = create_async_engine(
    DB_URI,
    echo=True,# 是否打印sql
    future=True,# 是否使用异步模式
    pool_pre_ping=True, # 检测数据库连接是否断开
    pool_recycle=3600, # 连接池中连接最大空闲时间(回收时间)
    pool_timeout=30, # 连接池中连接最大等待时间(超时时间)
    pool_size=10,  # 连接池大小
    max_overflow=20,# 连接池中连接最大数量

)

3.创建会话工厂

使用sqlalchemy.orm.sessionmaker类来创建会话工厂, 这个会话工厂实际上就是Session或者它的子类, 以后如果要操作数据库, 那么就需要创建一个会话工厂的对象(即Session类的对象), 来完成相关操作

代码


from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy.orm import sessionmaker

AsyncSessionMaker = sessionmaker(
    bind=engine,
    class_=AsyncSession,
    autocommit=False,
    expire_on_commit=False,
)

3.创建模型

1.创建Base类

# 定义命名约定的Base类
class Base(DeclarativeBase):
    metadata = MetaData(
        naming_convention={
            # 索引 index
            "ix": "ix_%(column_0_label)s",
            # 唯一索引 unique
            "uq": "uq_%(table_name)s_%(column_0_name)s",
            # 检查约束  check
            "ck": "ck_%(table_name)s_%(constraint_name)s",
            # 外键约束  foreign key
            "fk": "fk_%(table_name)s_%(column_0_name)s_%(referred_table_name)s",
            # 主键约束  primary key
            "pk": "pk_%(table_name)s",
        }
    )

2.创建User类

from sqlalchemy import Integer, Column, String
from sqlalchemy.orm import Mapped

from . import Base

class User(Base):
    """用户表"""
    __tablename__ = "user"
    
    id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
    email: Mapped[str] = mapped_column(String(100))
    username: Mapped[str] = mapped_column(String(100), unique=True,index= True)
    password: Mapped[str] = mapped_column(String(200) )