Python 如何使用pony orm以多对多关系加载数据?
以下是我的实体:Python 如何使用pony orm以多对多关系加载数据?,python,sql,ponyorm,Python,Sql,Ponyorm,以下是我的实体: class Article(db.Entity): id = PrimaryKey(int, auto=True) creation_time = Required(datetime) last_modification_time = Optional(datetime, default=datetime.now) title = Required(str) contents = Required(str) authors = S
class Article(db.Entity):
id = PrimaryKey(int, auto=True)
creation_time = Required(datetime)
last_modification_time = Optional(datetime, default=datetime.now)
title = Required(str)
contents = Required(str)
authors = Set('Author')
class Author(db.Entity):
id = PrimaryKey(int, auto=True)
first_name = Required(str)
last_name = Required(str)
articles = Set(Article)
下面是我用来获取数据的代码:
return left_join((article, author) for article in entities.Article
for author in article.authors).prefetch(entities.Author)[:]
无论我是否使用预取方法,生成的sql看起来总是一样的:
SELECT DISTINCT "article"."id", "t-1"."author"
FROM "article" "article"
LEFT JOIN "article_author" "t-1"
ON "article"."id" = "t-1"."article"
然后,当我迭代结果时,pony发出另一个查询(查询):
我希望的行为是,orm只发出一个查询,加载所有需要的数据。那么我该如何做到这一点呢?这应该是可行的
python
从pony.orm导入选择
如果article.authors==authors.id,则为文章中的文章选择((文章,作者)
PonyORM的作者在这里。我们不希望只使用一个查询加载所有这些对象,因为这是低效的
使用单个查询加载多对多关系的唯一好处是减少到数据库的往返次数。但是,如果我们将三个查询替换为一个查询,这并不是一个重大改进。当数据库服务器位于应用程序服务器附近时,这些往返实际上非常快,和用Python处理结果数据相比
另一方面,当使用同一查询加载多对多关系的两侧时,同一对象的数据将不可避免地在多行中重复。这有许多缺点:
article.contents
重复多次。单独的查询将传输尽可能少的数据量,大小的差异可能很容易达到一个数量级,这取决于特定的多对多关系所以,为了回答您的问题,您不能在一个查询中同时加载多对多关系的两侧。我认为这是件好事。试过了。你检查过生成的sql了吗?这是一个很好的解释,但是我仍然有
SELECT "id", "creation_time", "last_modification_time", "title", "contents"
FROM "article"
WHERE "id" = %(p1)s
SELECT "id", "first_name", "last_name"
FROM "author"
WHERE "id" IN (%(p1)s, %(p2)s)