zoukankan      html  css  js  c++  java
  • 【FastAPI 学习 二】SqlAlchemy Model模型类

    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-zd]*", 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

  • 相关阅读:
    CentOS同步时间
    使用dnsmasq来提升CentOS上网速度
    bash的变量设置
    CentOS找回root密码
    知识学习网站
    webservice接口测试,使用SoapUI工具进行接口测试
    js中字符串转换为数字
    css颜色大全
    Table分页显示调整
    iframe中,页面转换后回到页面的顶部
  • 原文地址:https://www.cnblogs.com/CharmCode/p/14191082.html
Copyright © 2011-2022 走看看