news 2026/7/23 3:14:13

FastAPI连接MySQL实现自动建表

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
FastAPI连接MySQL实现自动建表

1. 启动本地MySQL服务

Shell 终端输入:net start mysql80,先启动MySQL服务

Shell 终端输入:mysql -u root -p然后输入密码,进入MySQL数据库

Shell 终端输入:net stop mysql80,关闭MySQL服务

Shell 终端输入:(尽量手打,大小写皆可,注意空格)

CREATE DATABASE IF NOT EXISTS 数据库名字 CHARACTER SET utf8mb4;,创建数据库

其中:SHOW DATABASES;,查看所有数据库

高危:DROP DATABASE IF EXISTS 数据库名;,删除某个数据库

2. 安装依赖

conda环境输入:pip install async sqlalchemy,安装异步 ORM 框架,处理数据库交互

conda环境输入:pip install aiomysql,安装MySQL 异步驱动,适配 SQLAlchemy 异步引擎

3. 配置异步数据库,db_config.py

from sqlalchemy.ext.asyncio import async_sessionmaker, AsyncSession, create_async_engine # 数据库URL ASYNC_DATABASE_URL = "mysql+aiomysql://root:123456@localhost:3306/pdf_agent?charset=utf8mb4" # 创建异步引擎 async_engine = create_async_engine( ASYNC_DATABASE_URL, # 传入数据库连接 URL echo=True, # 可选:开启 SQL 日志输出,便于调试 pool_size=10, # 设置连接池中保持的持久连接数为 10 max_overflow=20 # 设置连接池允许创建的额外连接数最大为 20 ) # 创建异步会话工厂 AsyncSessionLocal = async_sessionmaker( bind=async_engine, # 绑定到之前创建的异步引擎 class_=AsyncSession, # 指定会话类为 AsyncSession expire_on_commit=False # 提交后不使对象属性过期,保持数据可访问 ) # 依赖项,用于获取数据库会话 async def get_db(): async with AsyncSessionLocal() as session: try: yield session # 将会话对象产出给调用者,暂停函数执行直到请求结束 await session.commit() # 如果无异常,提交事务 except Exception: await session.rollback() # 发生异常时回滚事务 raise # 重新抛出异常以便上层处理 finally: await session.close() # 关闭会话,释放资源

4. 创建数据库表

4.1 定义基类

from datetime import datetime, UTC from sqlalchemy import DateTime, String, Integer from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column def utc_now() -> datetime: return datetime.now(UTC) class Base(DeclarativeBase): # 创建时间:默认UTC时间,北京时间 = UTC + 8 小时 # UTC 是全球统一的标准时间基准,是互联网、服务器、数据库、日志、GPS、国际业务通用时间 created_at: Mapped[datetime] = mapped_column( DateTime, default=utc_now, comment="创建时间(UTC)" ) # 更新时间:新增默认赋值 + 每次update自动刷新 updated_at: Mapped[datetime] = mapped_column( DateTime, default=utc_now, onupdate=utc_now, comment="更新时间(UTC)" )

4.2 定义数据库表

from sqlalchemy import Integer, String, Float class User(Base): # 数据库表名 __tablename__ = "t_user" # 字段定义:Mapped 标注类型,mapped_column 配置字段属性 id: Mapped[int] = mapped_column( Integer, primary_key=True, autoincrement=True, name="user_id", comment="用户编号" ) name: Mapped[str] = mapped_column( String(20), name="user_name", nullable=False, comment="用户名" ) password: Mapped[str] = mapped_column( String(20), name="user_password", nullable=False, comment="密码" )

5. 自动创建数据库表

FastAPI 提供了事件监听机制,可以在项目启动(startup)时执行指定逻辑,利用该监听机制实现数据库表的自动创建。

from backend.db_models.db_file import Base from backend.config.db_conf import async_engine # 定义异步建表函数 async def create_tables(): async with async_engine.begin() as conn: # run_sync包裹同步的create_all,创建所有继承Base的表) await conn.run_sync(Base.metadata.create_all) # FastAPI 启动事件:服务运行自动执行建表 @app.on_event("startup") async def startup_event(): await create_tables()

启动 FastAPI 项目,uvicorn main:app --reload,可以看到表被创建

6. PyCharm 手动连接MySQL数据库

依次点击:

输入用户名 root 和 密码,点击测试连接

点击旁边的...,勾上表名 pdf_agent ,可以看到我们建的数据库表,也可以进行操作

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/23 3:14:04

2026年盘锦大米十大靠谱厂家排名,你选对了吗?

在消费升级的背景下,消费者对大米品质的要求日益提升。盘锦大米作为我国优质粳米的代表,凭借其得天独厚的生长环境和独特口感,一直备受市场青睐。然而,随着市场需求的增长,盘锦大米加工企业数量众多,质量参…

作者头像 李华
网站建设 2026/7/23 3:12:17

CDN性能优化与缓存策略实战指南

1. CDN性能问题深度解析与实战应对CDN作为现代互联网架构的核心组件,其性能直接影响着全球用户的访问体验。在实际运维中,我们常遇到以下几种典型性能问题:全球覆盖不均问题:某跨国电商平台曾反馈,其东南亚用户访问速度…

作者头像 李华
网站建设 2026/7/23 3:09:45

医药企业热力管网改造关键技术解析

1. 项目背景与核心需求解析华润双鹤作为国内领先的医药企业,其工业园区的能源基础设施升级具有典型的行业示范意义。2026年热力管线改造采购项目的启动,反映了医药制造企业在"双碳"目标下的能源系统迭代需求。这个预算规模约2.3亿元的改造工程…

作者头像 李华
网站建设 2026/7/23 3:07:10

Unity移动端性能优化:深度解析Overdraw原理与实战解决方案

1. 项目概述:为什么Overdraw是移动端性能的“隐形杀手”?做Unity开发,尤其是面向移动平台,性能优化是个绕不开的坎。你可能会花大力气去优化脚本逻辑、减少Draw Call、压缩贴图,但游戏运行时帧率依然不稳,手…

作者头像 李华
网站建设 2026/7/23 3:06:20

ORA-16191错误解析与DataGuard同步机制详解

1. ORA-16191错误解析与DataGuard同步机制DataGuard环境中出现ORA-16191错误时,通常会在备库的alert日志中看到类似这样的报错信息:"Primary log shipping client not logged on standby"。这个错误的核心含义是主库的日志传输服务&#xff08…

作者头像 李华