diff --git a/config.py b/config.py index 6c3afb1..5f0a15b 100644 --- a/config.py +++ b/config.py @@ -30,8 +30,11 @@ class MySQLConfig(BaseSettings): @property def sqlalchemy_db_uri(self): - return f"mysql+pymysql://{self.username}:{self.password}@{self.host}:{self.port}/{self.database}?charset=utf8" + return f"mysql+pymysql://{self.username}:{self.password}@{self.host}:{self.port}/{self.database}?charset=utf8mb4" + @property + def async_sqlalchemy_db_uri(self): + return f"mysql+aiomysql://{self.username}:{self.password}@{self.host}:{self.port}/{self.database}?charset=utf8mb4" class RedisConfig(RedisSettings): redis_host: Optional[str] = 'localhost' diff --git a/main.py b/main.py index ee35a2b..7e7dd40 100644 --- a/main.py +++ b/main.py @@ -5,7 +5,7 @@ import fastapi_plugins from fastapi import FastAPI, Request from fastapi.exceptions import HTTPException, RequestValidationError from fastapi.middleware.wsgi import WSGIMiddleware -from fastapi_sqlalchemy import DBSessionMiddleware +from fastapi_async_sqlalchemy import SQLAlchemyMiddleware from config import init_config # from src.middleware.flask import flask_app @@ -18,7 +18,7 @@ def create_app(): mysql_config, redis_config = init_config() # 添加sqlalchemy数据库中间件 # once the middleware is applied, any route can then access the database session from the global ``db`` - app.add_middleware(DBSessionMiddleware, db_url=mysql_config.sqlalchemy_db_uri) + app.add_middleware(SQLAlchemyMiddleware, db_url=mysql_config.async_sqlalchemy_db_uri) @app.on_event("startup") async def startup_event(): diff --git a/poetry.lock b/poetry.lock index a6d4768..158fda5 100644 --- a/poetry.lock +++ b/poetry.lock @@ -397,6 +397,26 @@ type = "legacy" url = "https://pypi.tuna.tsinghua.edu.cn/simple" reference = "mirrors" +[[package]] +name = "fastapi-async-sqlalchemy" +version = "0.6.1" +description = "SQLAlchemy middleware for FastAPI" +optional = false +python-versions = ">=3.7" +files = [ + {file = "fastapi-async-sqlalchemy-0.6.1.tar.gz", hash = "sha256:c4e0c9832e5e7ef9d647e7eb134e6d326945dca28323e503a21f3d4ab2dee160"}, + {file = "fastapi_async_sqlalchemy-0.6.1-py3-none-any.whl", hash = "sha256:0f4edfbc7b0f5fc2e0017cd903a953f4e0b01870f09e86cd0bc79087f3606bc4"}, +] + +[package.dependencies] +SQLAlchemy = ">=1.4.19" +starlette = ">=0.13.6" + +[package.source] +type = "legacy" +url = "https://pypi.tuna.tsinghua.edu.cn/simple" +reference = "mirrors" + [[package]] name = "fastapi-cli" version = "0.0.4" @@ -450,26 +470,6 @@ type = "legacy" url = "https://pypi.tuna.tsinghua.edu.cn/simple" reference = "mirrors" -[[package]] -name = "fastapi-sqlalchemy" -version = "0.2.1" -description = "Adds simple SQLAlchemy support to FastAPI" -optional = false -python-versions = ">=3.7" -files = [ - {file = "FastAPI-SQLAlchemy-0.2.1.tar.gz", hash = "sha256:7a9d44e46cbc73c3f5ee8c444f7e0bcd3d01370a878740abd4cd4d2e900ce9af"}, - {file = "FastAPI_SQLAlchemy-0.2.1-py3-none-any.whl", hash = "sha256:d3bfc6d9388a73a2c3726bc6bd7764cd82debfa71c16e3991c544b9701f48d96"}, -] - -[package.dependencies] -SQLAlchemy = ">=1.2" -starlette = ">=0.12.9" - -[package.source] -type = "legacy" -url = "https://pypi.tuna.tsinghua.edu.cn/simple" -reference = "mirrors" - [[package]] name = "greenlet" version = "3.0.3" @@ -2116,4 +2116,4 @@ reference = "mirrors" [metadata] lock-version = "2.0" python-versions = "^3.10" -content-hash = "39a4bc6981b275faba68cb572e406a60300d2d868e646fbbf62ad251e2288e37" +content-hash = "a2d3f4dd231a21f18cf3bb4faabebaa59ee95ec5597b388c83326036eda1b458" diff --git a/pyproject.toml b/pyproject.toml index b8b6b47..2a5be1d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -13,12 +13,12 @@ sqlalchemy = "2.0.0" aioredis = "2.0.1" aiomysql = "0.1.1" fastapi-plugins = "0.13.0" -fastapi-sqlalchemy = "^0.2.1" passlib = "^1.7.4" pytz = "^2024.1" qiniu = "^7.13.2" pillow = "^10.4.0" captcha = "^0.6.0" +fastapi-async-sqlalchemy = "^0.6.1" [[tool.poetry.source]] diff --git a/src/api/example.py b/src/api/example.py index bf6115b..8a4dad5 100644 --- a/src/api/example.py +++ b/src/api/example.py @@ -5,7 +5,7 @@ import aioredis from fastapi import APIRouter, Depends, Query from fastapi.security import OAuth2PasswordBearer from fastapi_plugins import depends_redis -from fastapi_sqlalchemy import db +from fastapi_async_sqlalchemy import db from sqlalchemy.sql import text from pydantic import BaseModel @@ -64,8 +64,10 @@ async def get_user_list_pages(page: int = Query(..., description="当前页码") # 数据库查询 @router.get('/get_db_version') async def get_db_version(): - result = db.session.execute(text("SELECT version()")).first() - return dict(result=result.tuple()[0]) + async with db(): + result = await db.session.execute(text("SELECT version()")) + version = result.first().tuple()[0] + return dict(result=version) # Redis 缓存查询 @router.get("/ping") diff --git a/src/service/__init__.py b/src/service/__init__.py index cceafd0..7574e8e 100644 --- a/src/service/__init__.py +++ b/src/service/__init__.py @@ -4,7 +4,7 @@ from traceback import format_exc import struct import sqlalchemy from sqlalchemy import text -from fastapi_sqlalchemy import db +from fastapi_async_sqlalchemy import db from jinja2 import Template from pymysql import err from pymysql.constants import FIELD_TYPE