【FastAPI后台API 二】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-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://www.charmcode.cn/article/2020-07-11_FastAPI_SqlAlchemy_Model

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
FastAPI是一个现代的Web框架,它支持异步编程和SQLAlchemy ORM。使用FastAPISQLAlchemy ORM可以轻松地构建高性能的Web应用程序。 在FastAPI中使用SQLAlchemy ORM时,可以使用asyncio和async/await语法来实现异步操作。这样可以提高应用程序的性能和吞吐量。 要在FastAPI中使用SQLAlchemy ORM,需要安装SQLAlchemy和asyncpg(或其他支持异步PostgreSQL的库)。然后,可以使用SQLAlchemy的ORM来定义模型,并使用async/await语法来执行数据库操作。 以下是一个使用FastAPISQLAlchemy ORM的示例: ```python from fastapi import FastAPI from sqlalchemy import create_engine, Column, Integer, String from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import sessionmaker app = FastAPI() SQLALCHEMY_DATABASE_URL = "postgresql://user:password@localhost/dbname" engine = create_engine(SQLALCHEMY_DATABASE_URL) SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine) Base = declarative_base() class User(Base): __tablename__ = "users" id = Column(Integer, primary_key=True, index=True) name = Column(String) email = Column(String, unique=True) @app.post("/users/") async def create_user(name: str, email: str): db = SessionLocal() user = User(name=name, email=email) db.add(user) db.commit() db.refresh(user) return user ``` 在上面的示例中,我们定义了一个User模型,并在create_user函数中使用async/await语法来执行数据库操作。我们使用SessionLocal来创建数据库会话,并使用add方法将新用户添加到数据库中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值