我正在尝试剖析大多数Python ORM中使用的模式,但是我查看的模式的源代码有点难以理解。
ORM如何构建其Model
,Field
和Query
类,以便延迟传递给.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()
答案 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,但应该很容易理解。