【发布时间】:2018-03-21 17:26:13
【问题描述】:
我发现 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 装饰器的任何其他方式?
【问题讨论】:
标签: ponyorm