# create_fastapi **Repository Path**: ktianc/create_fastapi ## Basic Information - **Project Name**: create_fastapi - **Description**: 初始 FastAPI 项目 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 4 - **Forks**: 1 - **Created**: 2022-01-27 - **Last Updated**: 2025-08-07 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 初始 FastAPI 项目 实现多数据库模式,数据库级别隔离数据,异步数据库,异步视图操作,新增一个独立主数据库 FastAPI 更新情况:https://fastapi.tiangolo.com/zh/release-notes/ FastAPI 官方文档:https://fastapi.tiangolo.com/zh/ pydantic 官方文档:https://pydantic-docs.helpmanual.io/ pydantic 数据模型代码生成器官方文档 (Json -> Pydantic):https://koxudaxi.github.io/datamodel-code-generator/ SQLAlchemy-Utils:https://sqlalchemy-utils.readthedocs.io/en/latest/ SQLAlchemy常用字段:https://www.cnblogs.com/wuheng-123/p/9691259.html SALAlchemy 关系字段官方文档:https://www.osgeo.cn/sqlalchemy/orm/relationship_api.html#sqlalchemy.orm.relationship SQLAlchemy 2.0查询方式:https://www.osgeo.cn/sqlalchemy/tutorial/data_select.html#tutorial-selecting-data SQLAlchemy 常用字段:https://blog.csdn.net/weixin_41896508/article/details/80772238 SALAlchemy 2.0增删改方式:https://www.osgeo.cn/sqlalchemy/tutorial/orm_data_manipulation.html#tutorial-orm-data-manipulation SQLALchemy 异步操作以及在FastAPI中的用例: https://blog.csdn.net/qq_42713497/article/details/121170132 ## 租户参考项目 一账通:https://arkid.cc/developer ## 项目结构 使用的是仿照 Django 项目结构: create_fastapi - alembic:数据库迁移配置目录 - application:主项目配置目录,也存放了主路由文件 - settings.py:主项目配置文件 - urls.py:主路由文件 - apps:项目的app存放目录 - core:核心文件目录 - database.py:关系型数据库核心配置 - exception.py:异常处理 - logger:日志处理核心配置 - middleware.py:中间件核心配置 - db:ORM模型基类 - logs:日志目录 - static:静态资源存放目录 - tests:测试接口文件目录 - utils:封装的一些工具类目录 - main.py:主程序入口文件 - alembic.ini:数据库迁移配置文件 ## 开发环境 开发语言:Python 3.8 开发框架:Fastapi 0.73.0 文件模板注释头信息: Pycharm配置:File | Settings | Editor | File and Code Templates ```python #!/usr/bin/python # -*- coding: utf-8 -*- # @version : 1.0 # @Creaet Time : ${DATE} ${TIME} # @File : ${NAME}.py # @IDE : ${PRODUCT_NAME} # @desc : 简要说明 ``` ## 使用 ``` # 拉取代码 git clone https://gitee.com/ktianc/create_fastapi.git cd create_fastapi/ # 安装依赖库 pip install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple/ # 第三方源: 1. 阿里源: https://mirrors.aliyun.com/pypi/simple/ ``` ### 运行启动 ``` # 命令行运行(开发模式) uvicorn main:app --host=127.0.0.1 --port=9000 --reload # 或者直接运行main文件(推荐) python main.py ``` 在线文档地址(在配置文件里面设置路径或者关闭) ``` http://127.0.0.1:9000/docs ``` Git更新ignore文件直接修改gitignore是不会生效的,需要先去掉已经托管的文件,修改完成之后再重新添加并提交。 ``` 第一步: git rm -r --cached . 去掉已经托管的文件 第二步: 修改自己的igonre文件内容 第三步: git add . git commit -m "clear cached" ``` 执行数据库迁移命令(终端执行) alembic 官方文档:https://alembic.sqlalchemy.org/en/latest/ alembic Github:https://github.com/sqlalchemy/alembic ```python # 创建迁移环境历史步骤 # 1. 在项目根目录下初始化环境,使用多数据库模板 alembic init --template multidb ./alembic # 2. 在alembic.ini配置文件中配置所有数据库的连接方式,这里设置了三个数据库 databases = main, service1, service2 [main] sqlalchemy.url = sqlite:///./main.db [service1] sqlalchemy.url = sqlite:///./service1.db # 3. 在alembic/env.py文件中配置元数据以及orm模型数据 # 添加当前项目路径到环境变量 BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) sys.path.append(BASE_DIR) # 导入项目中的基本映射类,与 需要迁移的 ORM 模型 from apps.vadmin.auth.models import * from apps.sadmin.auth.models import * from core.database import Model, MainModel # 注意:主数据库与服务系统数据库所使用的元数据不同,也是根据这个做映射区分的(已不需要,已更新为自动匹配) target_metadata = { 'main': MainModel.metadata, 'service1': Model.metadata, 'service2': Model.metadata, } # 使用服务系统接口,请先使用utils/aes_crypto.py/AES_Encrypt加密 ``` ```python # 初次生成迁移文件 alembic revision -m "生成迁移文件" # 通过该命令可以将模型迁移到数据库 alembic upgrade head # 如果有更新,则可以使用这个命令再次生成迁移文件,初次也可以使用 alembic revision --autogenerate -m "更新迁移文件" # --autogenerate:自动将当前模型的修改,生成迁移脚本。 # 通过该命令可以将模型迁移到数据库 alembic upgrade head ``` ``` # 手动新增服务数据库步骤,新增数据库saas_service2 # 1. 首先在项目数据库配置文件中新增获取数据库配置信息 application/conf/databases.ini [0-main] id = 0 type = mysql url = mysql+asyncmy://root:123456@127.0.0.1/saas_main?charset=utf8mb4 is_active = 1 [1-service1] id = 1 type = mysql url = mysql+asyncmy://root:123456@127.0.0.1/saas_service1?charset=utf8mb4 is_active = 1 [2-service2] id = 2 type = mysql url = mysql+asyncmy://root:123456@127.0.0.1/saas_service2?charset=utf8mb4 is_active = 1 # 2. 在alembic.ini配置文件中新增数据库连接 databases = main, service1 [main] sqlalchemy.url = mysql+pymysql://root:123456@127.0.0.1/saas_main [service1] sqlalchemy.url = mysql+pymysql://root:123456@127.0.0.1/saas_service1 [service2] sqlalchemy.url = mysql+pymysql://root:123456@127.0.0.1/saas_service2 # 3. 在alembic/env.py环境配置文件中新增指定元数据 target_metadata = { 'main': MainModel.metadata, 'service1': Model.metadata, 'service2': Model.metadata, } # 4. 复制一份saas_service1数据库到saas_service2,保持alembic_version、sqlite_master表数据相同即可 # 5. 通过该命令可以将模型迁移到数据库 alembic upgrade head ``` 生成迁移文件后,会在alembic迁移目录中的version目录中多个迁移文件 数据库配置项 连接引擎官方文档:https://www.osgeo.cn/sqlalchemy/core/engines.html asyncmy Github:https://github.com/long2ice/asyncmy 各数据库异步连接方式: ``` # SQLALCHEMY_DATABASE_URL = "postgresql://users:password@postgresserver/db_name" # SQLALCHEMY_DATABASE_URL = '"sqlite+aiosqlite:///./db_name.db"' # SQLALCHEMY_DATABASE_URL = '"mysql+asyncmy://root:123456@localhost/db_name"' ``` text可以执行sql字符串 不推荐 除非是存储过程 ```python from sqlalchemy import text from sqlalchemy.ext.asyncio import AsyncSession async with AsyncSession(async_egn) as session: result = await session.execute(text('select * from demotable')) print(result.all()) ``` 登录认证: Headers 添加字段:Authorization 分库步骤: 将校区表中的 ID 与 codename 字典加密,通过 query 查询参数方式请求接口,在依赖中解密,根据id 与 codename来获取指定数据库中的数据 主数据接口与校区数据接口独立分开,主系统不需要id 与 codename来解析 点击进入后会更新该数据的最近登录时间 问题总结: 1. sqlalchemy_utils ChoiceType migrate迁移报错的解决方案: https://blog.csdn.net/qq_33733970/article/details/79051495 2. ModuleNotFoundError: No module named 'Crypto' pip install pycryptodome -i https://mirrors.aliyun.com/pypi/simple/ 3alembic 迁移数据库 表名称不能存在大写!!!!!!!!!!!! 自动创建服务系统数据库,并自动配置系统默认数据 默认数据库名称:saas_服务系统标识 创建流程: 1. 创建数据库 2. 同步表结构 3. 同步表默认数据 4. 同步创建 databases.ini 数据库配置文件(用于连接使用) 5. 同步创建配置 alembic.ini 数据迁移配置文件(用于数据库迁移使用)(暂未添加) saas_service_temp 为服务系统模板数据库,不做业务处理,不存放业务数据,避免出现无服务系统数据库时,导致无法同步服务系统数据库处理 ## 版本 ### release 1.0 不包含数据库实现接口 ### release 2.0 增加数据库实现 ### release 3.0 实现多数据库模式,数据库级别隔离数据 ### release 3.2 实现多数据库模式,数据库级别隔离数据,异步数据库,异步视图操作 ### release 3.3 实现多数据库模式,数据库级别隔离数据,异步数据库,异步视图操作,新增一个独立主数据库 ### 4.0 优化版本 ### release 4.1 实现多数据库模式,数据库级别隔离数据,异步数据库,异步视图操作,新增一个独立主数据库