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) )