如何为Python的executeQuery方法添加装饰器实现查询字符串自动替换
实现前的基础修正
你当前代码里有两个需要先修正的语法问题:
- 定义字典时字符串类型的键需要加引号,否则会报
NameError,正确写法为basket = {'fruit': 'apple', 'vegetable': 'kale'} - 原
replaceQuery函数里的self参数冗余,你当前的调用逻辑没有用到类实例,不需要保留该参数
装饰器实现方案
按照你的需求,提供两种常用实现方式:
方式1:不带参数的装饰器(适合全局固定替换规则)
如果你的替换规则不需要频繁修改,可以直接把规则写在装饰器里,完全符合你预期的写法:
# 固定替换规则 BASKET = {'fruit': 'apple', 'vegetable': 'kale'} def replaceQuery(func): def wrapper(Client, query, *args, **kwargs): # 自动执行query替换逻辑 for key, value in BASKET.items(): if key in query: query = query.replace(key, value) # 调用原executeQuery执行查询 return func(Client, query, *args, **kwargs) return wrapper # 直接加装饰器即可 @replaceQuery def executeQuery(Client, query): result = Client.query(query) return result
方式2:带参数的装饰器(灵活支持不同替换规则)
如果需要给不同查询方法配置不同的替换规则,可以用带参数的装饰器,使用时传入指定的basket即可:
def replaceQuery(basket): def decorator(func): def wrapper(Client, query, *args, **kwargs): for key, value in basket.items(): if key in query: query = query.replace(key, value) return func(Client, query, *args, **kwargs) return wrapper return decorator # 使用时传入自定义的basket规则 basket = {'fruit': 'apple', 'vegetable': 'kale'} @replaceQuery(basket=basket) def executeQuery(Client, query): result = Client.query(query) return result
两种方式完成后,都可以直接调用executeQuery,不需要提前手动处理query:
# 示例调用,query会自动完成替换 client = 你的数据库客户端实例 executeQuery(client, "select * from table where type = fruit")
实现建议
- 替换逻辑建议加关键词边界判断,避免误伤:可以用正则替换
re.sub(rf'\b{key}\b', value, query),避免出现类似fruitbasket被误替换成applebasket的问题 - 可以给query加字符串类型校验,避免非字符串参数传入时报错
- wrapper里保留
*args, **kwargs可以兼容后续executeQuery新增参数,不需要修改装饰器代码 - 如果需要动态更新替换规则,可以在带参数的装饰器版本里给wrapper新增修改basket的方法,不需要重新定义装饰器
内容的提问来源于stack exchange,提问作者user2717470
相关产品推荐
相关产品推荐

