AndyYuan10000 2025-03-16 11:33 采纳率: 0%
浏览 61

fastapi + tortoise-orm 如何实现对db操作时候,打印出sql语句日志


import logging
import sys

from fastapi import FastAPI
from tortoise import Tortoise, run_async
from router import aerich
from starlette.middleware.cors import CORSMiddleware
from tortoise.contrib.fastapi import register_tortoise

app = FastAPI(title="DFS - FastAPI Tortoise ORM CRUD",
              description='''
''')

register_tortoise(
    app,
    db_url="sqlite://db.sqlite3",
    modules={"models": ["model"]},
    generate_schemas=False,
    add_exception_handlers=True,
)

app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)

app.include_router(aerich)


if __name__ == '__main__':
    fmt = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s', datefmt='%Y-%m-%d %H:%M:%S')
    handler = logging.StreamHandler(sys.stdout)
    handler.setLevel(logging.DEBUG)
    handler.setFormatter(fmt)
    logging_db_client = logging.getLogger("tortoise.db_client")
    logging_db_client.setLevel(logging.DEBUG)
    logging_db_client.addHandler(handler)
    logging_db_client.info("11111111111111")

    import uvicorn
    uvicorn.run("main:app", reload=True, port=5000,log_config=None)

以上写法没有效果
  • 写回答

6条回答 默认 最新

  • 阿里嘎多学长 2025-03-16 11:33
    关注

    阿里嘎多学长整理AIGC生成,因移动端显示问题导致当前答案未能完全显示,请使用PC端查看更加详细的解答过程

    解决方案

    FastAPI 和 Tortoise-ORM 都支持日志记录,可以使用 Python 的 logging 模块来实现。下面是一个简单的示例:

    import logging
    from tortoise import Tortoise
    
    # 设置日志级别
    logging.basicConfig(level=logging.INFO)
    
    # 创建一个日志记录器
    logger = logging.getLogger('tortoise')
    
    # 使用 Tortoise 的 `set_log_level` 方法设置日志级别
    Tortoise.set_log_level(logging.INFO)
    
    # 创建一个 FastAPI 应用程序
    app = FastAPI()
    
    # 使用 Tortoise 的 `run_async` 函数来运行数据库操作
    @app.on_event("startup")
    async def startup_event():
        await Tortoise.init(db_url='sqlite:///test.db', modules={'models': ['models']})
        await Tortoise.generate_schemas()
    
    # 在数据库操作中使用日志记录
    @app.get("/users/")
    async def read_users():
        users = await User.all()
        logger.info(f"SELECT * FROM users")
        return users
    
    # 在 models.py 文件中定义 User 模型
    from tortoise import Model, IntField, CharField
    
    class User(Model):
        id = IntField(pk=True)
        name = CharField(max_length=255)
    
        def __str__(self):
            return self.name
    

    在上面的示例中,我们使用 logging 模块设置日志级别为 INFO,然后使用 Tortoise.set_log_level 方法设置 Tortoise 的日志级别为 INFO。在数据库操作中,我们使用 logger.info 方法来记录 SQL 语句。

    models.py 文件中,我们定义了 User 模型,并使用 __str__ 方法来定义模型的字符串表示。

    main.py 文件中,我们创建了一个 FastAPI 应用程序,并使用 Tortoise.init 方法来初始化 Tortoise。然后,我们使用 Tortoise.generate_schemas 方法来生成数据库 schema。

    read_users 函数中,我们使用 User.all 方法来获取所有用户,然后使用 logger.info 方法来记录 SQL 语句。

    这样,在数据库操作时,我们可以看到 SQL 语句的日志记录。

    评论

报告相同问题?

问题事件

  • 创建了问题 3月16日