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