【Python-Web】fastapi sqlalchemy 使用 ORM或SQL 查询,分页以及返回json的方式

sqlalchemy 使用 ORM 查询,分页以及返回json的方式

目前学习到该处,记录下,有更正确或优雅的方式,欢迎评论区里告知,谢谢

貌似直接使用 skip (offset) 的方式更简洁

前端计算skip(offset) 的 值, 
由 page limit 的方式 改用 :  skip 和 limit 的方式
改动最小

助手函数版

# common/dbhelper

from sqlalchemy.orm.query import Query

from app.schemas.common import Page


def EmptyWhere(i):
    return (i is not None) and (i != '')


def CreateWhere(_model, _data, _col_list: list) -> list:
    sql_where = []
    if type(_data) == dict:
        for col in _col_list:
            if EmptyWhere(_data.get(col)):
                sql_where.append(getattr(_model, col) == _data.get(col))
    if type(_data) == object:
        for col in _col_list:
            if EmptyWhere(getattr(_data, col)):
                sql_where.append(getattr(_model, col) == getattr(_data, col))
    return sql_where


def GetPage(query: Query, page: int, limit: int) -> Page:
    offset = int((page - 1) * limit)
    total = query.count()
    results_dict = query.offset(
        0 if offset < 0 else offset).limit(limit).all()
    return Page(page=page, limit=limit, total=total, data=results_dict)
    

orm 的版本

from sqlalchemy.orm import Session

# orm 的版本
def get_list(db: Session,
             page: int = 1, limit: int = 10, 
             xx: str = None, bb: str = None):
    offset = (page - 1) * limit
    sql_where = []
    if not xx is None:
        sql_where.append(models.xx.Xx.xx == xx)
    if not bb is None:
        sql_where.append(models.xx.Xx.bb == bb)
    query = db.query(models.xx.Xx).where(*sql_where)
    results_dict = query.offset(offset).limit(limit).all()
    total = query.count()
    res = {
        'page': page,
        'limit': limit,
        'total': total,
        'data': results_dict,
    }
    return res

sql 版本

from sqlalchemy.orm import Session
from sqlalchemy.sql import text
# sql 版本
def get_list(db: Session, page: int = 1, limit: int = 10):
    offset = (page - 1) * limit    
    total = 0
    try:
        total = db.execute(text('SELECT count(*) FROM xxx;')).one()[0]
    except Exception as e:
        print('Exception', e)
    # 执行SQL语句
    with db:
        result = db.execute(text('SELECT * FROM xxx limit :offset,:limit;'),
                            {"offset": offset, "limit": limit})
    # 将结果转换为字典列表
    results_dict = [dict(row) for row in result.mappings()]
    res = {
        'page': page,
        'limit': limit,
        'total': total,
        'data': results_dict,
    }
    return res
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是使用 FastAPI 中 Tortoise-ORMSQLAlchemy 和 peewee 进行 ORM 查询的示例。 ## Tortoise-ORM ```python from fastapi import FastAPI from tortoise import fields from tortoise.contrib.fastapi import register_tortoise, HTTPNotFoundError from tortoise.models import Model from tortoise import Tortoise class User(Model): id = fields.IntField(pk=True) name = fields.CharField(50) email = fields.CharField(50) class Meta: table = "users" app = FastAPI() @app.on_event("startup") async def startup(): await Tortoise.init( db_url="sqlite://db.sqlite3", modules={"models": ["main"]} ) await Tortoise.generate_schemas() @app.on_event("shutdown") async def shutdown(): await Tortoise.close_connections() @app.get("/users") async def get_users(): users = await User.all() return users @app.get("/users/{user_id}") async def get_user(user_id: int): user = await User.get_or_none(id=user_id) if user is None: raise HTTPNotFoundError return user register_tortoise( app, db_url="sqlite://db.sqlite3", modules={"models": ["main"]}, generate_schemas=True, add_exception_handlers=True ) ``` ## SQLAlchemy ```python from fastapi import FastAPI from sqlalchemy import create_engine, Column, Integer, String from sqlalchemy.orm import sessionmaker from sqlalchemy.ext.declarative import declarative_base Base = declarative_base() class User(Base): __tablename__ = "users" id = Column(Integer, primary_key=True, index=True) name = Column(String(50)) email = Column(String(50)) engine = create_engine("sqlite:///db.sqlite3") SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine) app = FastAPI() @app.get("/users") async def get_users(): db = SessionLocal() users = db.query(User).all() db.close() return users @app.get("/users/{user_id}") async def get_user(user_id: int): db = SessionLocal() user = db.query(User).filter(User.id == user_id).first() db.close() if user is None: raise HTTPNotFoundError return user ``` ## peewee ```python from fastapi import FastAPI from peewee import SqliteDatabase, Model, CharField, IntegerField from playhouse.shortcuts import model_to_dict db = SqliteDatabase("db.sqlite3") class User(Model): id = IntegerField(primary_key=True) name = CharField() email = CharField() class Meta: database = db table_name = "users" app = FastAPI() @app.on_event("startup") def startup(): db.connect() db.create_tables([User]) @app.on_event("shutdown") def shutdown(): db.close() @app.get("/users") async def get_users(): users = [model_to_dict(user) for user in User.select()] return users @app.get("/users/{user_id}") async def get_user(user_id: int): user = User.get_or_none(User.id == user_id) if user is None: raise HTTPNotFoundError return model_to_dict(user) ``` 注意:以上示例中的代码仅用于演示 ORM 查询的基本用法,并且没有进行错误处理。在实际应用中,你应该根据需要添加适当的错误处理和安全性检查。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值