FastAPI SqlAlchemy ORM Model
本系列博客是配合Vue开发一套后台管理系统,对应的Vue教程见个人博客
https://www.charmcode.cn/
FastAPI 使用 SqlAlchemy创建models
文件目录
| |____db // 数据库文件夹
| | |______init__.py
| | |____session.py // 创建 SessionLocal 对象
| | |____base_class.py // model基础模块 如通用字段
| | |____base.py // 导出全部models 给alembic迁移用
| |____models // 项目models 文件(我没像django那样放到各模块下面,单独抽出来了)
| | |______init__.py
| | |____auth.py // 用户权限相关的
| | |____goods.py // 各项目模块 商品模块
SqlAlchemy SessionLocal对象
在session.py
文件生成 SessionLocal对象
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from app.core.config import settings
engine = create_engine(settings.SQLALCHEMY_DATABASE_URL, pool_pre_ping=True)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
Model Base类
在base_class.py
文件中生成基础的Model Base类
添加通用的字段 设置表名字格式
from typing import Any
from datetime import datetime
from sqlalchemy import Column, Integer, DateTime
from sqlalchemy.ext.declarative import as_declarative, declared_attr
@as_declarative()
class Base:
# 通用的字段
id: Any
create_time = Column(DateTime, default=datetime.now, onupdate=datetime.now, comment="创建时间")
update_time = Column(DateTime, default=datetime.now, onupdate=datetime.now, comment="更新时间")
is_delete = Column(Integer, default=0, comment="逻辑删除:0=未删除,1=删除")
__name__: str
# Generate __tablename__ automatically
@declared_attr
def __tablename__(cls) -> str:
import re
# 如果没有指定__tablename__ 则默认使用model类名转换表名字
name_list = re.findall(r"[A-Z][a-z\d]*", cls.__name__)
# 表明格式替换成_格式 如 MallUser 替换成 mall_user
return "_".join(name_list).lower()
各模块Model类
比如用户模块 models/auth.py
创建了两个model 一个用户,一个角色
import uuid
from sqlalchemy import Boolean, Column, Integer, String, VARCHAR, BIGINT
from app.api.db.base_class import Base
def gen_id():
return uuid.uuid4().hex
class AdminUser(Base):
"""
管理员用户表
"""
__tablename__ = "admin_user"
id = Column(Integer, primary_key=True, index=True)
user_id = Column(String(32), default=gen_id, comment="用户id")
email = Column(String(128), unique=True, index=True, nullable=False, comment="邮箱")
phone = Column(VARCHAR(16), unique=True, index=True, nullable=True, comment="手机号")
nickname = Column(String(128), comment="用户昵称")
avatar = Column(String(256), comment="用户头像")
hashed_password = Column(String(128), nullable=False, comment="密码")
is_active = Column(Boolean(), default=False, comment="邮箱是否激活")
role_id = Column(Integer, comment="角色表")
class AdminRole(Base):
"""
简单的用户角色表设计
"""
role_id = Column(Integer, primary_key=True, index=True, comment="角色Id")
role_name = Column(String(64), comment="角色名字")
permission_id = Column(BIGINT, comment="权限ID")
re_mark = Column(String(128), comment="备注信息")
导出方便迁移
把所有的model导入到 db/base.py
文件, 方便 Alembic 迁移表
from app.api.db.base_class import Base # noqa
from app.api.models.auth import AdminUser, AdminRole
本章代码 GitHub地址
https://github.com/CoderCharm/fastapi-mysql-generator
跳转个人博客地址查看 https://www.charmcode.cn/article/2020-07-11_FastAPI_SqlAlchemy_Model