SQLAlchemy和Python中的条件过滤

218 篇文章 12 订阅

目录

介绍

背景

查询帮助程序

自定义查询类

将查询类与db会话一起使用

条件过滤

过滤器模型

使用filter_if

使用代码

引用


介绍

SQLAlchemy中,我们很熟悉filterfilter_by。但是,如果我们需要进行条件过滤怎么办。下面是创建自定义条件筛选器运算符的示例。

背景

这是另一种常见情况,当过滤器属性的值为null/empty或不满足特定需求时,我们需要忽略WHERE条件的一部分。如下图所示:

查询帮助程序

自定义查询类

SQLAlchemy创建一个客户查询类以包含新filter_if方法。

这里conditiontrue*criterion将应用为过滤器.

检查query_helper.py

from sqlalchemy.orm import Query

class CustomQuery(Query):
    def filter_if(self: Query, condition: bool, *criterion):
        if condition:
            return self.filter(*criterion)
        else:
            return self

将查询类与db会话一起使用

将此自定义查询类添加到SQLAlchemy会话中,以使用新创建的filter_if方法。

database.py 

from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
from db.query_helper import CustomQuery

SQLALCHEMY_DATABASE_URL = "sqlite:repo_app/data/test_sql_app.db"
engine = create_engine(
    SQLALCHEMY_DATABASE_URL, connect_args={"check_same_thread": False}
)

SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine, query_cls=CustomQuery)
Base = declarative_base()

  • 所有表模型的AppBaseModelOrm通用类或基类
  • GroupQueue数据库表,我们将在其中使用new运算符

models.py

class AppBaseModelOrm:
    id = Column(Integer, primary_key=True, index=True, autoincrement=True)
    is_active = Column(Boolean, default=True)  # soft delete
    created_by = Column(Integer)
    updated_by = Column(Integer, default=None)
    created_datetime = Column(DateTime(timezone=True), default=datetime.datetime.utcnow)
    updated_datetime = Column(DateTime(timezone=True), default=None, onupdate=datetime.datetime.utcnow)

    account_id = Column(Integer)


class GroupQueue(AppBaseModelOrm, Base):
    __tablename__ = "group_queues"
    name = Column(String, index=True)

条件过滤

过滤器模型

这是一个FastApi pydantic模型

schemas.py 

from sqlalchemy.orm import Query

class CustomQuery(Query):
    def filter_if(self: Query, condition: bool, *criterion):
        if condition:
            return self.filter(*criterion)
        else:
            return self

使用filter_if

这里GroupQueueCrud是一个CRUD帮助程序类,检查正在调用或使用filter_ifsearch方法

group_queue_crud.py 

from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
from db.query_helper import CustomQuery

SQLALCHEMY_DATABASE_URL = "sqlite:repo_app/data/test_sql_app.db"
engine = create_engine(
    SQLALCHEMY_DATABASE_URL, connect_args={"check_same_thread": False}
)

SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine, query_cls=CustomQuery)
Base = declarative_base()

使用代码

Go to backend folder
Open cmd 
Type docker-compose up -d

\backend> docker-compose up -d

project will run http://localhost:4003

Go to Api Doc
http://localhost:4003/docs#/

引用

使用自定义查询类python - SQLAlchemy - can you add custom methods to the query object? - Stack Overflow

https://www.codeproject.com/Articles/5307388/Conditional-filtering-in-SQLAlchemy-and-Python

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值