我发现Pony是一个用于小项目的很好的orm。然而,当你的项目超过某个点时,对于编写的每个函数来说,在函数中放置@db_session几乎是必须的。
遵循可靠的原则,我正在尝试连接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装饰器乱七八糟的方式?
发布于 2020-11-19 18:03:54
首先,在我看来,您是在试图与Pony的设计理念背道而驰:@db_session装饰器的整个想法是将您从处理数据库管理(样板代码、打开/关闭数据库、SQL、回滚等)中解脱出来。我知道你想自己做这件事,因此把@db_session的想法渲染得毫无意义
其次,本质上,除非装饰器在调用时有副作用,否则它只是一个以调用开始和结束的包装器。因此,让它持续存在的想法也与其预期目标背道而驰。
总而言之,如果你想做pony为你提供的工具的工作,你最好干脆放弃使用pony。
也许,你应该问问你自己,为什么你想要小马,为什么你想摆脱装饰者。下定决心会帮助你做出正确的决定。
HTH
https://stackoverflow.com/questions/49412916
复制相似问题