【发布时间】:2011-01-16 22:31:41
【问题描述】:
我正在开发一个 Web API,在后端有 10 个左右的表,有几个一对多和多对多的关联。 API 本质上是一个执行验证更新和条件查询的数据库包装器。它是用 Python 编写的,我使用 SQLAlchemy 进行 ORM 和 CherryPy 进行 HTTP 处理。
到目前为止,我已将 API 执行的 30 多个查询分离为它们自己的函数,如下所示:
# in module "services.inventory"
def find_inventories(session, user_id, *inventory_ids, **kwargs):
query = session.query(Inventory, Product)
query = query.filter_by(user_id=user_id, deleted=False)
...
return query.all()
def find_inventories_by(session, app_id, user_id, by_app_id, by_type, limit, page):
....
# in another service module
def remove_old_goodie(session, app_id, user_id):
try:
old = _current_goodie(session, app_id, user_id)
services.inventory._remove(session, app_id, user_id, [old.id])
except ServiceException, e:
# log it and do stuff
....
CherryPy 请求处理程序根据需要调用分散在多个服务模块中的查询方法。该解决方案背后的基本原理是,由于它们需要访问多个模型类,它们不属于单个模型,而且这些数据库查询应该与 API 访问的直接处理分开。
我意识到上面的代码在重构领域可能被称为Foreign Methods。我可以在一段时间内接受这种组织方式,但随着事情开始变得有些混乱,我正在寻找一种方法来重构这段代码。
- 由于查询直接与 API 及其业务逻辑相关联,因此它们很难像 getter 和 setter 一样一概而论。
- 像这样重复
session参数有点味道,但由于 API 的当前实现为每个 API 调用创建了一个新的 CherryPy 处理程序实例,因此为session对象,没有全局方法来获取当前session。
是否有一种完善的模式来组织此类查询?我应该坚持使用外部方法并尝试统一函数签名(参数排序、命名约定等)吗?你有什么建议?
【问题讨论】:
-
“自己的方法”?你是说“功能”吗?它们不能是方法,因为没有类,也没有
self变量。除非您已将self变量重命名为session。 -
是的,你是对的。目前它们是模块级函数,而不是方法。我已经更正了问题中的用词不当。
标签: python design-patterns orm refactoring sqlalchemy