FastAPI连接MySQL实现自动建表的示例代码

 更新时间:2026年07月24日 09:40:45   作者:无敌大蛋糕  
本文主要介绍了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 ,可以看到我们建的数据库表,也可以进行操作

到此这篇关于FastAPI连接MySQL实现自动建表的示例代码的文章就介绍到这了,更多相关MySQL 自动建表内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MySql InnoDB存储引擎之Buffer Pool运行原理讲解

    MySql InnoDB存储引擎之Buffer Pool运行原理讲解

    缓冲池是用于存储InnoDB表,索引和其他辅助缓冲区的缓存数据的内存区域。缓冲池的大小对于系统性能很重要。更大的缓冲池可以减少磁盘I/O来多次访问同一表数据。在专用数据库服务器上,可以将缓冲池大小设置为计算机物理内存大小的百分之80
    2023-01-01
  • mysql中text,longtext,mediumtext区别小结

    mysql中text,longtext,mediumtext区别小结

    在 MySQL 中,text、mediumtext 和 longtext 都是用来存储大量文本数据的数据类型,本文就来详细的介绍一下这三种类型的区别,具有一定的参考价值,感兴趣的可以了解一下
    2023-12-12
  • C#编写方法实例

    C#编写方法实例

    在下面的练习中,将创建一个应用程序,它包含的一个方法能够计算一名顾问的收费金额——假定该顾问每天收取固定的费用,将根据工作了多少天来收费。首先要开发应用程序的逻辑,然后利用“生成方法存根向导”来写出这个逻辑使用的方法。接着,我们将在一个控制台应用程序中运行方法,以获得对该程序的最终印象。最后,我们将使用Visual Studio 2005调试器来检查方法调用。
    2008-04-04
  • 详细讲一讲MySQL中Select语句的执行顺序

    详细讲一讲MySQL中Select语句的执行顺序

    SQL和MySQL的语句执行顺序是数据库操作中的关键概念,理解这一顺序有助于编写更高效、更精确的查询,这篇文章主要介绍了MySQL中Select语句执行顺序的相关资料,需要的朋友可以参考下
    2026-01-01
  • MySQL回表产生的原因和场景

    MySQL回表产生的原因和场景

    在MySQL数据库中,回表(Look Up)指的是在进行索引查询时,首先通过索引定位到对应页,然后再根据行的物理地址找到所需的数据行,本文给大家介绍了MySQL回表是什么以及哪些情况下会回表,需要的朋友可以参考下
    2023-11-11
  • Linux系统每日定时备份mysql数据的方法步骤

    Linux系统每日定时备份mysql数据的方法步骤

    这篇文章主要介绍了Linux系统每日定时备份mysql数据的方法步骤,包括创建文件夹、编写脚本、设置定时任务和测试脚本,详细步骤涵盖从文件夹创建到脚本执行的全过程,帮助用户实现数据库的自动备份,需要的朋友可以参考下
    2024-11-11
  • MongoDB日期查询操作图文详解

    MongoDB日期查询操作图文详解

    MongoDB中按日期查询是一种常见的查询操作,而按日期查询也是开发人员在MongoDB工作中最常遇到的查询任务之一,这篇文章主要给大家介绍了关于MongoDB日期查询操作的相关资料,需要的朋友可以参考下
    2024-02-02
  • mysql server is running with the --skip-grant-tables option

    mysql server is running with the --skip-grant-tables option

    今天在mysql中新建数据库提示The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement,原来是数据中配置的--skip-grant-tables,这样安全就降低了,这个一般当忘记root密码的时候需要这样操作
    2017-07-07
  • MySQL 锁体系从 MDL到间隙锁详解

    MySQL 锁体系从 MDL到间隙锁详解

    本文详细解析了MySQL的锁机制,包括MDL锁、意向锁和锁,并解释了不同锁的的使用场景和潜在问题冲突,强调理解锁机制对以优化数据库性能,感兴趣的朋友一起看看吧
    2026-06-06
  • MYSQL插入处理重复键值的几种方法

    MYSQL插入处理重复键值的几种方法

    当unique列在一个UNIQUE键上插入包含重复值的记录时,默认insert的时候会报1062错误,MYSQL有三种不同的处理方法,下面我们分别介绍。
    2012-09-09

最新评论