ORM过滤模式

时间:2017-10-19 21:09:16

标签: python orm sqlalchemy peewee

我正在尝试剖析大多数Python ORM中使用的模式,但是我查看的模式的源代码有点难以理解。

ORM如何构建其ModelFieldQuery类,以便延迟传递给.filter()类方法的语句?

我试图将我的问题编成法典,希望这样可以更容易理解(请参阅main()中的评论。

class YuckORM:
    def __init__(self):
        self.files = [
            File('https://cdn.fake/doc.pdf', 1000),
            File('https://cdn.fake/song.mp3', 2000),
            File('https://cdn.fake/video.mp4', 3000),
        ]

    def query(self):
        return Query(self.files)


class Query:
    def __init__(self, files):
        self.files = files

    def filter(self, **args):
        files = []
        # do filtering somehow?
        return Query(files)

    def all(self):
        return self.files


class Field:
    def _init__(self, name):
        self.name = name


class File:
    url = Field('url')
    size = Field('size')

    def __init__(self, url, size):
        self.url = url
        self.size = size


def main():
    yorm = YuckORM()
    all_the_things = yorm.query.all()  # this part is easy
    # this is where I'm confused.
    some_of_them = yorm.query.filter(File.size > 1000).all()


if __name__ == '__main__':
    main()

1 个答案:

答案 0 :(得分:0)

Peewee使用数据结构来表示事物。模型,字段,表达式,查询等。当您传递要执行的这些数据结构时,它们将转换为SQL,然后作为数据库游标返回。然后有一个单独的逻辑,它将游标返回的扁平行元组重建到适当的模型实例中。

peewee代码库非常小,约5000行 - 应该给你一个想法。看看3.0a分支,因为它更容易阅读。 https://github.com/coleifer/peewee/blob/3.0a/peewee.py

对于更精简的“查询构建器”库代码,您可以查看:https://github.com/coleifer/sweepea/blob/master/sweepea.pyx#L1964-L3116 - 它是Cython,但应该很容易理解。