python - 有条件地向 SQLAlchemy 查询添加多个过滤器,而无需重复代码
问题描述
我有一个 SQLAlchemy 模型:
class Ticket(db.Model):
__tablename__ = 'ticket'
id = db.Column(INTEGER(unsigned=True), primary_key=True, nullable=False,
autoincrement=True)
cluster = db.Column(db.VARCHAR(128))
@classmethod
def get(cls, cluster=None):
query = db.session.query(Ticket)
if cluster is not None:
query = query.filter(Ticket.cluster==cluster)
return query.one()
如果我添加一个新列并想扩展该get
方法,我必须添加一个if xxx is not None
如下所示:
@classmethod
def get(cls, cluster=None, user=None):
query = db.session.query(Ticket)
if cluster is not None:
query = query.filter(Ticket.cluster==cluster)
if user is not None:
query = query.filter(Ticket.user==user)
return query.one()
有什么办法可以提高效率吗?如果我的列太多,该get
方法将变得如此丑陋。
解决方案
与往常一样,如果您不想编写重复的内容,请使用循环:
@classmethod
def get(cls, **kwargs):
query = db.session.query(Ticket)
for k, v in kwargs.items():
query = query.filter(getattr(table, k) == v)
return query.one()
因为我们不再将cluster=None
/设置user=None
为默认值(而是取决于调用者未指定的内容,根本不会添加到kwargs
),我们不再需要阻止添加空值过滤器:如果用户实际要求搜索None
;的值,则 null 值将最终出现在参数列表中 所以这个新代码能够在它发生时兑现这个请求。
如果您希望保留调用约定,cluster
可以user
按位置传递 和 (但用户无法搜索 的值None
),请参阅此答案的初始版本。
推荐阅读
- javascript - GTM 和优化:JS 变量未定义,但在控制台中运行良好
- css - 可能不兼容的“div”标签和 updateSelectInput
- r - 按因子水平手动将标签单独(或一起)添加到barplot ggplot
- r - R- 根据一个值删除几行
- javascript - Ngrx 效果并行 http 调用
- r - R中的多元回归模型问题
- arrays - Ionic 5:运行时错误:未定义不是对象
- azure-devops - 如果试用过期,如何将许可证密钥添加到 Azure DevOps
- hibernate - org.hibernate.tool.schema.spi.CommandAcceptanceException:执行 DDL 时出错
- reactjs - 如何创建可跨多个 React 项目使用的私有共享组件库