FastAPI連接MySQL實(shí)現(xiàn)自動(dòng)建表的示例代碼
1. 啟動(dòng)本地MySQL服務(wù)
Shell 終端輸入:net start mysql80 ,先啟動(dòng)MySQL服務(wù)
Shell 終端輸入:mysql -u root -p ,然后輸入密碼,進(jìn)入MySQL數(shù)據(jù)庫
Shell 終端輸入:net stop mysql80 ,關(guān)閉MySQL服務(wù)
Shell 終端輸入:(盡量手打,大小寫皆可,注意空格)
CREATE DATABASE IF NOT EXISTS 數(shù)據(jù)庫名字 CHARACTER SET utf8mb4; ,創(chuàng)建數(shù)據(jù)庫
其中:SHOW DATABASES; ,查看所有數(shù)據(jù)庫
高危:DROP DATABASE IF EXISTS 數(shù)據(jù)庫名; ,刪除某個(gè)數(shù)據(jù)庫
2. 安裝依賴
conda環(huán)境輸入:pip install async sqlalchemy ,安裝異步 ORM 框架,處理數(shù)據(jù)庫交互
conda環(huán)境輸入:pip install aiomysql ,安裝MySQL 異步驅(qū)動(dòng),適配 SQLAlchemy 異步引擎
3. 配置異步數(shù)據(jù)庫,db_config.py
from sqlalchemy.ext.asyncio import async_sessionmaker, AsyncSession, create_async_engine
# 數(shù)據(jù)庫URL
ASYNC_DATABASE_URL = "mysql+aiomysql://root:123456@localhost:3306/pdf_agent?charset=utf8mb4"
# 創(chuàng)建異步引擎
async_engine = create_async_engine(
ASYNC_DATABASE_URL, # 傳入數(shù)據(jù)庫連接 URL
echo=True, # 可選:開啟 SQL 日志輸出,便于調(diào)試
pool_size=10, # 設(shè)置連接池中保持的持久連接數(shù)為 10
max_overflow=20 # 設(shè)置連接池允許創(chuàng)建的額外連接數(shù)最大為 20
)
# 創(chuàng)建異步會(huì)話工廠
AsyncSessionLocal = async_sessionmaker(
bind=async_engine, # 綁定到之前創(chuàng)建的異步引擎
class_=AsyncSession, # 指定會(huì)話類為 AsyncSession
expire_on_commit=False # 提交后不使對(duì)象屬性過期,保持?jǐn)?shù)據(jù)可訪問
)
# 依賴項(xiàng),用于獲取數(shù)據(jù)庫會(huì)話
async def get_db():
async with AsyncSessionLocal() as session:
try:
yield session # 將會(huì)話對(duì)象產(chǎn)出給調(diào)用者,暫停函數(shù)執(zhí)行直到請(qǐng)求結(jié)束
await session.commit() # 如果無異常,提交事務(wù)
except Exception:
await session.rollback() # 發(fā)生異常時(shí)回滾事務(wù)
raise # 重新拋出異常以便上層處理
finally:
await session.close() # 關(guān)閉會(huì)話,釋放資源4. 創(chuàng)建數(shù)據(jù)庫表
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):
# 創(chuàng)建時(shí)間:默認(rèn)UTC時(shí)間,北京時(shí)間 = UTC + 8 小時(shí)
# UTC 是全球統(tǒng)一的標(biāo)準(zhǔn)時(shí)間基準(zhǔn),是互聯(lián)網(wǎng)、服務(wù)器、數(shù)據(jù)庫、日志、GPS、國際業(yè)務(wù)通用時(shí)間
created_at: Mapped[datetime] = mapped_column(
DateTime,
default=utc_now,
comment="創(chuàng)建時(shí)間(UTC)"
)
# 更新時(shí)間:新增默認(rèn)賦值 + 每次update自動(dòng)刷新
updated_at: Mapped[datetime] = mapped_column(
DateTime,
default=utc_now,
onupdate=utc_now,
comment="更新時(shí)間(UTC)"
)4.2 定義數(shù)據(jù)庫表
from sqlalchemy import Integer, String, Float
class User(Base):
# 數(shù)據(jù)庫表名
__tablename__ = "t_user"
# 字段定義:Mapped 標(biāo)注類型,mapped_column 配置字段屬性
id: Mapped[int] = mapped_column(
Integer,
primary_key=True,
autoincrement=True,
name="user_id",
comment="用戶編號(hào)"
)
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. 自動(dòng)創(chuàng)建數(shù)據(jù)庫表
FastAPI 提供了事件監(jiān)聽機(jī)制,可以在項(xiàng)目啟動(dòng)(startup)時(shí)執(zhí)行指定邏輯,利用該監(jiān)聽機(jī)制實(shí)現(xiàn)數(shù)據(jù)庫表的自動(dòng)創(chuàng)建。
from backend.db_models.db_file import Base
from backend.config.db_conf import async_engine
# 定義異步建表函數(shù)
async def create_tables():
async with async_engine.begin() as conn:
# run_sync包裹同步的create_all,創(chuàng)建所有繼承Base的表)
await conn.run_sync(Base.metadata.create_all)
# FastAPI 啟動(dòng)事件:服務(wù)運(yùn)行自動(dòng)執(zhí)行建表
@app.on_event("startup")
async def startup_event():
await create_tables()啟動(dòng) FastAPI 項(xiàng)目, uvicorn main:app --reload,可以看到表被創(chuàng)建
6. PyCharm 手動(dòng)連接MySQL數(shù)據(jù)庫
依次點(diǎn)擊:

輸入用戶名 root 和 密碼,點(diǎn)擊測試連接

點(diǎn)擊旁邊的 ... ,勾上表名 pdf_agent ,可以看到我們建的數(shù)據(jù)庫表,也可以進(jìn)行操作

到此這篇關(guān)于FastAPI連接MySQL實(shí)現(xiàn)自動(dòng)建表的示例代碼的文章就介紹到這了,更多相關(guān)MySQL 自動(dòng)建表內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySql?InnoDB存儲(chǔ)引擎之Buffer?Pool運(yùn)行原理講解
緩沖池是用于存儲(chǔ)InnoDB表,索引和其他輔助緩沖區(qū)的緩存數(shù)據(jù)的內(nèi)存區(qū)域。緩沖池的大小對(duì)于系統(tǒng)性能很重要。更大的緩沖池可以減少磁盤I/O來多次訪問同一表數(shù)據(jù)。在專用數(shù)據(jù)庫服務(wù)器上,可以將緩沖池大小設(shè)置為計(jì)算機(jī)物理內(nèi)存大小的百分之802023-01-01
mysql中text,longtext,mediumtext區(qū)別小結(jié)
在 MySQL 中,text、mediumtext 和 longtext 都是用來存儲(chǔ)大量文本數(shù)據(jù)的數(shù)據(jù)類型,本文就來詳細(xì)的介紹一下這三種類型的區(qū)別,具有一定的參考價(jià)值,感興趣的可以了解一下2023-12-12
詳細(xì)講一講MySQL中Select語句的執(zhí)行順序
SQL和MySQL的語句執(zhí)行順序是數(shù)據(jù)庫操作中的關(guān)鍵概念,理解這一順序有助于編寫更高效、更精確的查詢,這篇文章主要介紹了MySQL中Select語句執(zhí)行順序的相關(guān)資料,需要的朋友可以參考下2026-01-01
Linux系統(tǒng)每日定時(shí)備份mysql數(shù)據(jù)的方法步驟
這篇文章主要介紹了Linux系統(tǒng)每日定時(shí)備份mysql數(shù)據(jù)的方法步驟,包括創(chuàng)建文件夾、編寫腳本、設(shè)置定時(shí)任務(wù)和測試腳本,詳細(xì)步驟涵蓋從文件夾創(chuàng)建到腳本執(zhí)行的全過程,幫助用戶實(shí)現(xiàn)數(shù)據(jù)庫的自動(dòng)備份,需要的朋友可以參考下2024-11-11
mysql server is running with the --skip-grant-tables option
今天在mysql中新建數(shù)據(jù)庫提示The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement,原來是數(shù)據(jù)中配置的--skip-grant-tables,這樣安全就降低了,這個(gè)一般當(dāng)忘記root密碼的時(shí)候需要這樣操作2017-07-07

