连接PonyORM的问题

时间:2018-03-21 17:26:13

标签: ponyorm

我发现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装饰者的其他方式?

1 个答案:

答案 0 :(得分:1)

首先,在我看来,您正在尝试对抗Pony的设计理念:@db_session装饰器的整个想法是使您不必处理数据库管理(样板代码,打开/关闭DB,SQL,回滚)等等),我知道您想自己做,因此呈现了@db_session模拟的想法

第二,从本质上讲,除非装饰器在调用时有副作用,否则它只是一个以调用开始和结束的包装器。因此,保持其持久性的想法也正朝着其预期目的的相反方向发展。

总而言之,如果您想完成小马为您提供的设施的工作,则最好完全放弃使用小马。

也许,你应该问自己为什么要小马,为什么要摆脱装饰工。下定决心将帮助您为您做出正确的决定。

HTH