我发现Pony是一个很好的用于小项目的工作室。但是,当你的项目超过某一点时,在你的函数中放置@db_session对于每个编写的函数来说几乎是强制性的。
遵循SOLID原则,我正在尝试连接PonyORM。然而,事实证明并不像我想象的那么容易。
class CustomQuery(object):
def __init__(self, query):
self.obj = query
def __getattr__(self, attr):
return getattr(self.obj, attr)
@db_session
def count(self):
return self.obj.count()
@db_session
def first(self):
return self.obj.first()
@db_session
def without_distinct(self):
return self.obj.without_distinct()
def __iter__(self):
return self.obj.__iter__()
class DatabaseService:
@staticmethod
@db_session
def select(*args):
# This will be select() interface
return CustomQuery(select(*args))
这是我尝试做的一个例子。但是当我做一些事情时,我遇到了问题:
# User has many PhoneNumbers
user = User.select().first()
assert isInstance(user, CustomQuery)
user.phone_numbers.count()
如果我理解正确,在执行user.phone_numbers.count()
时会创建一个新的pony.orm.core.Query
对象。
我想改为返回一个CustomQuery
对象,这样就可以使db_session保持不变。
有关如何做到这一点的任何想法?或者其他人处理过一堆@db_session
装饰者的其他方式?
答案 0 :(得分:1)
首先,在我看来,您正在尝试对抗Pony的设计理念:@db_session装饰器的整个想法是使您不必处理数据库管理(样板代码,打开/关闭DB,SQL,回滚)等等),我知道您想自己做,因此呈现了@db_session模拟的想法
第二,从本质上讲,除非装饰器在调用时有副作用,否则它只是一个以调用开始和结束的包装器。因此,保持其持久性的想法也正朝着其预期目的的相反方向发展。
总而言之,如果您想完成小马为您提供的设施的工作,则最好完全放弃使用小马。
也许,你应该问自己为什么要小马,为什么要摆脱装饰工。下定决心将帮助您为您做出正确的决定。
HTH